2013-07-10 38 views
5

Tôi đã được giao nhiệm vụ tích hợp CRM đa khách hàng trong nước của chúng tôi với Salesforce.com. Tôi sẽ viết một dịch vụ dựa trên máy chủ, sẽ đẩy thông tin từ mỗi khách hàng của chúng tôi vào kho dữ liệu CRM đến Salesforce. Tôi muốn sử dụng API REST SFDC, nhưng có thể sử dụng API SOAP nếu cần.Cách tiếp cận bảo mật tốt nhất để tích hợp Salesforce.com với máy chủ .NET C#

Tôi đang đấu tranh để hiểu cơ chế bảo mật tốt nhất để sử dụng. Vì giải pháp sẽ dựa trên máy chủ, điều quan trọng là không cần tương tác người dùng khi kết nối với SFDC. Máy chủ của chúng tôi cần có khả năng thiết lập kết nối an toàn tới SFDC mà không cần người dùng cung cấp bằng chứng xác thực đăng nhập của họ.

Cho đến nay tôi đã thử nghiệm với API REST và OAuth2.0. Tôi đã thiết lập một tài khoản SFDC thử nghiệm và cấu hình ứng dụng của chúng tôi bên trong nó, nhận khóa người dùng, khóa bí mật và uri gọi lại. Điều này tất cả các công trình, và trang gọi lại của tôi nhận được một mã thông báo bảo mật. Trang callback của tôi sử dụng token cung cấp như sau:

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; 

Vấn đề là, mỗi khi tôi chạy này, tôi nhận được một (trái phép) trả lời 401 từ SFDC, mặc dù tôi đang đi qua các thẻ an ninh được cung cấp bởi SFDC.

REST API là phương pháp chính xác cho truy cập 'không được giám sát' như thế này, và bất cứ ai có thể tư vấn cho những gì tôi làm sai trong mã của tôi, hoặc cung cấp những lời khôn ngoan về cách làm việc này?

Rất cám ơn.

Trả lời

1

Bạn đã xem Digging Deeper into OAuth 2.0 on Force.com chưa?

Nếu bạn đọc kỹ, bạn có thể thấy rằng code quay lại trang callback sau đó phải được sử dụng để có được access_token. Ví dụ, người dùng sẽ được chuyển hướng đến trang của bạn như thế này:

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

Sau đó, bạn phải thực hiện một POST HTTP đến dịch vụ thẻ ở đây:

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

Với các dữ liệu đã mã hóa url sau (dòng phá vỡ thêm vào cho dễ đọc):

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

Các Salesforce máy chủ thẻ sẽ trở lại với một số dữ liệu JSON như sau:

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

Trả lại access_token có thể được sử dụng để ủy quyền các yêu cầu cho API REST. Khi nó hết hạn có thể lấy được bằng cách sử dụng refresh_token.

Giả sử, refresh_token tồn tại lâu và sẽ cho phép bạn nhận một số khác access_token miễn là người dùng đã cấp quyền truy cập ứng dụng của bạn. Vì vậy, lưu trữ nó ở đâu đó an toàn.

Đối với API nào để sử dụng, tôi đã triển khai một số tích hợp "không giám sát" bằng cách sử dụng API SOAP, vì vậy tôi biết rằng nó có thể hoạt động trong trường hợp đó. Từ quan điểm bảo mật, nhược điểm của việc này là bạn phải lưu trữ thông tin xác thực một cách an toàn. Tuy nhiên, bạn sẽ phải có khả năng giải mã chúng để có được một sessionid. Bởi vì điều này, chúng không thể được lưu trữ an toàn như thể chúng được băm bằng cách sử dụng mã hóa 1 chiều.

Với API REST, bạn chỉ cần lưu trữ refresh_token.Nếu bị xâm nhập, kẻ tấn công sẽ có ít hơn nhiều để đạt được từ việc có được những so với một cơ sở dữ liệu đầy đủ các thông tin. Cho điểm đó, nếu tôi bắt đầu từ đầu hôm nay tôi có thể sẽ cung cấp cho REST API một shot.