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 から提供されたセキュリティ トークンを渡しているにもかかわらず、SFDC から 401 (無許可) 応答を受信することです。

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 を使用していくつかの「無人」統合を実装したので、そのシナリオで機能することがわかっています。セキュリティの観点から、これを行うことの欠点は、資格情報を安全に保存する必要があることです。ただし、セッション ID を取得するには、それらを復号化できる必要があります。このため、一方向暗号化を使用してハッシュされているかのように安全に保管することはできません。

REST API を使用すると、refresh_token. 侵害された場合、攻撃者がこれらを取得しても得られるものは、資格情報でいっぱいのデータベースよりもはるかに少なくなります。その点を考えると、今日ゼロから始めるとしたら、おそらく REST API を試すでしょう。

于 2013-07-10T23:36:51.333 に答える