Mutual authentication(two-way authentication) Callin

Callout 時の Mutual authentication については、サーバ編クライアント編 を参照。

Callin(外部から Salesforce への API 接続)時には、Salesforce のサーバ認証とは別に、クライアント認証も行えるようになっている(Salesforce.com Winter ’14 リリースノート/相互認証)。注意点としては、Callout 時のサーバ認証時と同様に Salesforce で信頼される認証局での署名である必要がある。対応している証明書は Outbound Messaging SSL CA Certificates にリストされている。

クライアント証明書のアップロードと、接続ユーザの SSL/TLS 相互認証を適用 が有効になれば設定は完了となる。テストとしては、cURL で以下の通り実行し疎通できれば良い。

$ curl -k https://ap.salesforce.com:8443/services/Soap/u/33.0 -H "Content-Type: text/xml; charset=UTF-8" -H "SOAPAction: login" -d @login.xml --cert mycrient.crt --key mycrient.key
<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <n1:login xmlns:n1="urn:partner.soap.sforce.com">
      <n1:username>my username</n1:username>
      <n1:password>my password</n1:password>
    </n1:login>
  </env:Body>
</env:Envelope>

Hello Account (REST using cURL)

cURL で Hello Account。

$ curl -k -d grant_type=password -d client_id= -d client_secret= -d username= -d password= https://test.salesforce.com/services/oauth2/token -H 'X-PrettyPrint:1'

$ curl https://cs6.salesforce.com/services/data/v31.0/query?q=SELECT+Id+,+Name+FROM+Account -H 'Authorization: Bearer ' -H 'Content-Type: application/json' -H 'X-PrettyPrint:1'

cURL で Bulk API を叩く

  1. セッション ID を取得
  2. ユーザ名とパスワードを login.xml にする。

    <?xml version="1.0" encoding="utf-8" ?>
      <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    
        <env:Body>
          <n1:login xmlns:n1="urn:partner.soap.sforce.com">
            <n1:username>username@domain.com</n1:username>
            <n1:password>password</n1:password>
          </n1:login>
        </env:Body>
    </env:Envelope>
    


    認証のエンドポイントは SOAP(Partner)側にして、”SOAPAction: login”。

    $ curl https://test.salesforce.com/services/Soap/u/28.0 -H "Content-Type: text/xml; charset=UTF-8" -H "SOAPAction: login" -d @login.xml
    


    XML で serverurl と sessionid が確認できる。serverurl のインスタンス名を使用したものが、今後のエンドポイントとなる。

    <?xml version='1.0' encoding='utf-8'?>
    <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:body>
        <loginresponse>
          <result>
            ...
            <serverurl>
              https://cs6.salesforce.com/services/Soap/u/28.0/00DNxxxxxxxxxxx
            </serverurl>
            <sessionid>
              00DNxxxxxxxxxxx!AQUAQN8QhONTb7BTHDeXsS3TwD6nLtZrYSbp9nnd64nnOJsRIvaV2vomczOdxlsTL1qdh0DWYYkasAE20zGMqmgGXHa4YlCG
            </sessionid>
            ...
          </result>
        </loginresponse>
      </soapenv:body>
    </soapenv:envelope>
    
  3. ジョブの作成
  4. オペレーションとその対象オブジェクトを “job.xml” に書く。例えば、Contact オブジェクトに insert する。

    <?xml version="1.0" encoding="UTF-8"?>
    <jobInfo xmlns="http://www.force.com/2009/06/asyncapi/dataload">
      <operation>insert</operation>
      <object>Contact</object>
      <contentType>CSV</contentType>
    </jobInfo>
    


    “/services/async/28.0/job” でジョブ操作用のエンドポイントとなる。

    $ curl https://cs6.salesforce.com/services/async/28.0/job -H 'X-SFDC-Session: 00DNxxxxxxxxxxx!AQUAQN8QhONTb7BTHDeXsS3TwD6nLtZrYSbp9nnd64nnOJsRIvaV2vomczOdxlsTL1qdh0DWYYkasAE20zGMqmgGXHa4YlCG' -H "Content-Type: application/xml; charset=UTF-8" -d @job.xml
    


    ジョブが作成されれば、JobId が確認できる。

    <?xml version="1.0" encoding="UTF-8"?>
    <jobInfo
       xmlns="http://www.force.com/2009/06/asyncapi/dataload">
     <id>750xxxxxxxxxxxxxxx</id>
     ...
    </jobInfo>
    
  5. バッチの作成
  6. サンプルとして 2 件のレコードを “data.csv” として用意。

    FirstName,LastName,Department,Birthdate,Description
    Tom,Jones,Marketing,1940-06-07Z,"Self-described as ""the top"" branding guru on the West Coast"
    Ian,Dury,R&D,,"World-renowned expert in fuzzy logic design.Influential in technology purchases."
    


    エンドポイントに JobId を指定する。

    $ curl https://cs6.salesforce.com/services/async/28.0/job/750xxxxxxxxxxxxxxx/batch -H 'X-SFDC-Session: 00DNxxxxxxxxxxx!AQUAQN8QhONTb7BTHDeXsS3TwD6nLtZrYSbp9nnd64nnOJsRIvaV2vomczOdxlsTL1qdh0DWYYkasAE20zGMqmgGXHa4YlCG' -H "Content-Type: text/csv; charset=UTF-8" --data-binary @data.csv
    


    バッチが作成されれば BatchId が確認できる。状態は Queued なので実行待ち。

    <?xml version="1.0" encoding="UTF-8"?>
      <batchInfo xmlns="http://www.force.com/2009/06/asyncapi/dataload">
        <id>751xxxxxxxxxxxxxx</id>
        <jobId>750xxxxxxxxxxxxxx</jobId>
        <state>Queued</state>
        ...
      </batchInfo>
    
  7. ジョブのクローズ
  8. 無事 Batch が完了すれば、ジョブをクローズする。
    クローズのオペレーションを “close_job.xml” に書く。

    <?xml version="1.0" encoding="UTF-8"?>
    <jobInfo xmlns="http://www.force.com/2009/06/asyncapi/dataload">
      <state>Closed</state>
    </jobInfo>
    


    エンドポイントには JobId を指定。

    $ curl https://cs6.salesforce.com/services/async/28.0/job/750xxxxxxxxxxxxxxx -H 'X-SFDC-Session: 00DNxxxxxxxxxxx!AQUAQN8QhONTb7BTHDeXsS3TwD6nLtZrYSbp9nnd64nnOJsRIvaV2vomczOdxlsTL1qdh0DWYYkasAE20zGMqmgGXHa4YlCG' -H "Content-Type: application/xml; charset=UTF-8" -d @close_job.xml
    


    “Closed” の状態になっていることが確認できる。

    <?xml version="1.0" encoding="UTF-8"?>
      <jobInfo xmlns="http://www.force.com/2009/06/asyncapi/dataload">
        <id>750xxxxxxxxxxxxxxx</id>
        <operation>insert</operation>
        <object>Contact</object>
        ...
        <state>Closed</state>
        ...
      </jobInfo>