2013-07-10 9 views
5

Sono stato incaricato di integrare il nostro CRM multi-cliente con Salesforce.com. Sto andando a scrivere un servizio basato su server che invierà informazioni da ciascuno dei nostri datastore CRM clienti a Salesforce. Mi piacerebbe utilizzare l'API REST di SFDC, ma se possibile, è possibile utilizzare l'API SOAP.Miglior approccio di sicurezza per l'integrazione di Salesforce.com con .NET Server C#

Sto lottando per capire il miglior meccanismo di sicurezza da utilizzare. Poiché la soluzione sarà basata su server, è essenziale che non sia necessaria alcuna interazione da parte dell'utente durante la connessione a SFDC. Il nostro server deve essere in grado di stabilire una connessione sicura a SFDC senza che l'utente fornisca le proprie credenziali di accesso.

Finora ho sperimentato con l'API REST e OAuth2.0. Ho configurato un account SFDC di test e configurato la nostra app al suo interno, ottenendo la chiave del consumatore, la chiave segreta e il callback uri. Tutto funziona e la mia pagina di richiamata riceve un token di sicurezza. La mia pagina di callback utilizza il token forniti come segue:

string rc = ""; 
try 
{ 

    string uri = "https://eu2.salesforce.com/services/data/v20.0/sobjects/"; 
    System.Net.WebRequest req = System.Net.WebRequest.Create(uri); 
    req.Method = "GET"; 
    req.Headers.Add("Authorization: Bearer " + token); 
    System.Net.WebResponse resp = req.GetResponse(); 
    System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); 
    rc = "code=" + code + ", response=" + sr.ReadToEnd().Trim(); 
} 
catch (Exception ex) 
{ 
    rc = "45435465 Token=" + token + ", err=" + ex.Message; 
} 
return rc; 

Il problema è che, ogni volta che corro questo ho ricevuto una risposta (non autorizzato) 401 da SFDC, anche se sto passando il token di protezione fornito da SFDC.

L'API REST è l'approccio corretto per l'accesso "non presidiato" come questo, e qualcuno può consigliare cosa sto facendo male nel mio codice o offrire parole di saggezza su come farlo funzionare?

Molte grazie.

risposta

1

Hai dato un'occhiata a Digging Deeper into OAuth 2.0 on Force.com?

Se si legge attentamente, è possibile vedere che il deve essere restituito alla pagina callback per ottenere uno access_token. Ad esempio, l'utente verrà reindirizzato alla pagina come questa:

https://app.example.com/oauth_callback?code=aWekysIEeqM9PiThEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w%3D%3D 

È necessario poi fare un HTTP POST al servizio token qui:

https://login.salesforce.com/services/oauth2/token 

Con i seguenti dati con codifica URL (linea di pause aggiunti per migliorare la leggibilità):

code=aWekysIEeqM9PiThEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w== 
&grant_type=authorization_code 
&client_id=<your_client_id> 
&client_secret=<your_client_secret> 
&redirect_uri=<your_redirect_uri> 

Il server di token Salesforce tornerà con alcuni dati JSON come segue:

{ 
    "id":"https://login.salesforce.com/id/00D50000000IZ3ZEAW/00550000001fg5OAAQ", 
    "issued_at":"1296458209517", 
    "refresh_token":"5Aep862eWO5D.7wJBuW5aaARbbxQ8hssCnY1dw3qi59o1du7ob.lp23ba_3jMRnbFNT5R8X2GUKNA==", 
    "instance_url":"https://na1.salesforce.com", 
    "signature":"0/1Ldval/TIPf2tTgTKUAxRy44VwEJ7ffsFLMWFcNoA=", 
    "access_token":"00D50000000IZ3Z!AQ0AQDpEDKYsn7ioKug2aSmgCjgrPjG9eRLza8jXWoW7uA90V39rvQaIy1FGxjFHN1ZtusBGljncdEi8eRiuit1QdQ1Z2KSV" 
} 

Il reso access_token può essere utilizzato per autorizzare richieste all'API REST. Quando scade, è possibile ottenerne uno nuovo utilizzando lo refresh_token.

Presumibilmente, lo refresh_token è di lunga durata e consente di ottenere un altro access_token per tutto il tempo in cui l'utente ha concesso l'accesso dell'applicazione. Quindi, salvalo in un posto sicuro.

Per quanto riguarda l'API da utilizzare, ho implementato diverse integrazioni "non presidiate" utilizzando l'API SOAP, quindi so che può funzionare in tale scenario. Da un punto di vista della sicurezza, il lato negativo di fare questo è che è necessario memorizzare in modo sicuro le credenziali. Tuttavia, dovrai essere in grado di decrittografarli per ottenere un sessionid. Per questo motivo, non possono essere archiviati in modo sicuro come se fossero stati sottoposti a hash con la crittografia a 1 via.

Con l'API REST, è sufficiente memorizzare lo refresh_token.Se compromesso, l'aggressore avrebbe molto meno da guadagnare da ottenere questi contro un database pieno di credenziali. Dato questo punto, se dovessi iniziare da zero oggi probabilmente darei un colpo all'API REST.

Problemi correlati