2013-07-10 43 views
5

我的任务是将我们自己开发的多客户端CRM与Salesforce.com集成。我将编写一个基于服务器的服务,将来自我们每个客户CRM数据存储的信息推送到Salesforce。我想使用SFDC REST API,但可以根据需要使用SOAP API。将Salesforce.com与.NET Server C集成的最佳安全方法#

我很努力去理解最好的安全机制。由于解决方案将基于服务器,因此连接到SFDC时不需要用户交互。我们的服务器需要能够建立到SFDC的安全连接,而无需用户提供其登录凭证。

到目前为止,我已经尝试了REST API和OAuth2.0。我已经设置了一个测试SFDC帐户并在其中配置了我们的应用程序,获取了使用者密钥,密钥和回调函数uri。这一切正常,我的回调页面收到一个安全令牌。我的回调页面使用提供的令牌如下:

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; 

麻烦的是,每次我跑这个时候我收到SFDC 401(未授权)的回复,即使我路过SFDC提供的安全令牌。

REST API是否是像这样的“无人值守”访问的正确方法,任何人都可以建议我在代码中做错了什么,或者提供关于如何使其工作的智慧词汇?

非常感谢。

回答

1

你看过Digging Deeper into OAuth 2.0 on Force.com吗?

如果你仔细看,你可以看到code返回callback页面必须被用来获得access_token。例如,用户将被重定向到您的网页是这样的:

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

您必须然后做一个HTTP POST到令牌服务在这里:

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

使用下列URL编码数据(线增加了可读性休息):

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

Salesforce的令牌服务器将与一些JSON数据返回如下:

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

返回的access_token可用于授权对REST API的请求。当它到期时,可以使用refresh_token获得一个新的。

据推测,refresh_token是长期存在的,只要用户授予您的应用程序访问权限,您就可以获得另一个access_token。所以,把它存放在安全的地方。

关于使用哪个API,我已经使用SOAP API实现了几个“无人值守”集成,所以我知道它可以在这种情况下工作。从安全角度来看,这样做的缺点是您必须安全地存储凭据。但是,您必须能够解密它们才能获得会话ID。正因为如此,它们不能像使用单向加密一样安全地存储。

使用REST API,您只需要存储refresh_token。如果受到攻击,攻击者可以通过获取这些数据库而获得更多的收益,而这些数据库充满了凭据。考虑到这一点,如果我今天要从头开始,我可能会给REST API一个镜头。