5

我的任务是将我们本土的多客户 CRM 与 Salesforce.com 集成。我将编写一个基于服务器的服务,它将信息从我们每个客户的 CRM 数据存储区推送到 Salesforce。我想使用 SFDC REST API,但如有必要可以使用 SOAP API。

我正在努力了解要使用的最佳安全机制。由于该解决方案将基于服务器,因此在连接到 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 是这种“无人值守”访问的正确方法吗?任何人都可以建议我在我的代码中做错了什么,或者就如何使其工作提供智慧之言吗?

非常感谢。

4

1 回答 1

1

您看过Force.com 上的 Digging Deeper into OAuth 2.0吗?

如果您仔细阅读,您会发现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 实现了几个“无人值守”的集成,所以我知道它可以在那种情况下工作。从安全的角度来看,这样做的缺点是您必须安全地存储凭据。但是,您必须能够解密它们才能获得 sessionid。因此,它们无法像使用单向加密进行散列一样安全地存储。

使用 REST API,您只需将refresh_token. 如果受到损害,攻击者从获取这些信息中获得的收益将比获取完整凭据的数据库要少得多。考虑到这一点,如果我今天从头开始,我可能会给 REST API 一个机会。

于 2013-07-10T23:36:51.333 回答