wha*_*ean 5 asp.net asp.net-mvc oauth salesforce oauth-2.0
我的任务是将我们自己开发的多客户端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;
Run Code Online (Sandbox Code Playgroud)
麻烦的是,每次运行此操作时,即使我传递了SFDC提供的安全令牌,我也会收到SFDC的401(未经授权)回复.
REST API是否是这种"无人值守"访问的正确方法,任何人都可以告诉我在我的代码中做错了什么,或提供关于如何使其工作的智慧之词?
非常感谢.
您是否看过Force.com 上的 Digging Deeper into OAuth 2.0?
如果您仔细阅读,您会发现code返回到callback页面的 必须用于获取access_token. 例如,用户将被重定向到您的页面,如下所示:
https://app.example.com/oauth_callback?code=aWekysIEeqM9PiThEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w%3D%3D
Run Code Online (Sandbox Code Playgroud)
然后,您必须在此处向令牌服务发出 HTTP POST:
https://login.salesforce.com/services/oauth2/token
Run Code Online (Sandbox Code Playgroud)
使用以下 url 编码数据(添加换行符以提高可读性):
code=aWekysIEeqM9PiThEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w==
&grant_type=authorization_code
&client_id=<your_client_id>
&client_secret=<your_client_secret>
&redirect_uri=<your_redirect_uri>
Run Code Online (Sandbox Code Playgroud)
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"
}
Run Code Online (Sandbox Code Playgroud)
返回的结果access_token可用于授权对 REST API 的请求。当它过期时,可以使用 获取新的refresh_token。
据说,它的寿命很长,只要用户授予您的应用程序访问权限,refresh_token您就可以获得另一个。access_token因此,请将其存放在安全的地方。
关于使用哪个 API,我已经使用 SOAP API 实现了几个“无人值守”集成,因此我知道它可以在该场景中工作。从安全角度来看,这样做的缺点是您必须安全地存储凭据。但是,您必须能够解密它们才能获得 sessionid。因此,它们不能像使用单向加密进行散列那样安全地存储。
使用 REST API,您只需存储refresh_token. 如果受到威胁,与充满凭据的数据库相比,攻击者从获取这些信息中获得的收益会少得多。鉴于这一点,如果我今天要从头开始,我可能会尝试一下 REST API。
| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |