2013-07-10 20 views
5

Mam za zadanie zintegrowanie naszego domowego CRM z wieloma klientami z Salesforce.com. Mam zamiar napisać usługę opartą na serwerze, która będzie przekazywać informacje z każdego z naszych magazynów danych CRM klientów do Salesforce. Chciałbym użyć interfejsu API REST SFDC, ale w razie potrzeby mógłbym użyć interfejsu API SOAP.Najlepsze podejście bezpieczeństwa do integracji Salesforce.com z .NET Server C#

Staram się zrozumieć najlepszy mechanizm bezpieczeństwa do użycia. Ponieważ rozwiązanie będzie oparte na serwerze, ważne jest, aby podczas łączenia z SFDC nie była wymagana interakcja użytkownika. Nasz serwer musi mieć możliwość ustanowienia bezpiecznego połączenia z SFDC bez podawania przez użytkownika danych logowania.

Do tej pory eksperymentowałem z interfejsem API REST i OAuth2.0. Mam skonfigurowane testowe konto SFDC i skonfigurowałem w nim naszą aplikację, pobierając klucz klienta, tajny klucz i wywołanie zwrotne. To wszystko działa, a moja strona wywołania zwrotnego otrzymuje token bezpieczeństwa. Moja strona zwrotna używa dostarczonego żeton następująco:

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; 

Kłopot w tym, za każdym razem uruchomić to otrzymam 401 (Nieautoryzowany) odpowiedź od SFDC, chociaż jestem przekazując token zabezpieczeń dostarczonych przez SFDC.

Czy interfejs REST API jest właściwym podejściem do tego rodzaju dostępu bez nadzoru i czy ktoś może doradzić, co robię źle w swoim kodzie, czy może wyrazić mądrość, jak to zrobić?

Wielkie dzięki.

Odpowiedz

1

Czy spojrzałeś na Digging Deeper into OAuth 2.0 on Force.com?

Jeśli czytasz uważnie, możesz zobaczyć, że code powrócił na stronę callback, aby następnie uzyskać access_token. Na przykład, użytkownik zostanie przekierowany na stronę tak:

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

Następnie należy wykonać HTTP POST do tokenu usługi tutaj:

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

następujące dane url zakodowane (linia przerwy dodawany dla czytelności):

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

serwer żeton Salesforce powróci z niektórych danych JSON następująco:

{ 
    "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" 
} 

Zwrócona access_token może zostać użyta do autoryzacji żądań do REST API. Po jej wygaśnięciu można uzyskać nową przy użyciu refresh_token.

Podobno urządzenie refresh_token ma długą żywotność i pozwoli uzyskać kolejny numer access_token tak długo, jak użytkownik przyznał dostęp do aplikacji. Więc przechowuj go w bezpiecznym miejscu.

W odniesieniu do których API do stosowania, I wprowadziły kilka „bez opieki” integracji za pomocą interfejsu API SOAP, więc wiem, że może on pracować w tym scenariuszu. Z punktu widzenia bezpieczeństwa, wadą jest to, że robi, że masz do bezpiecznego przechowywania poświadczeń. Jednak trzeba będzie w stanie odszyfrować je w celu uzyskania sessionid. Z tego powodu nie mogą być bezpiecznie przechowywane jako jakby były zakodowane przy użyciu szyfrowania 1-way.

Dzięki API REST, trzeba tylko zapisać refresh_token.Jeśli zostanie naruszony, atakujący będzie miał o wiele mniej korzyści z uzyskania tych danych w porównaniu do bazy danych pełnej poświadczeń. Biorąc pod uwagę tę kwestię, gdybym miał zacząć od zera dzisiaj, prawdopodobnie dałbym REST API strzał.

Powiązane problemy