Contents
概要
外部からSalesforceのAPIを叩く方法についてご紹介致します。
今回は、外からAPIを叩いてリードレコードを生成してみたいと思います。
※Apex REST Webサービスは利用せず、標準のAPIを叩きます。
ちなみに今回の例、「Web-to-リードでよいのでは?」と思われた方もいらっしゃるかもしれませんが、Web-to-リードには一日500件までという制限があるため、今回の例のようにWeb API経由でリードをPOSTする実装にすることもままあります。
一点、Web API経由でリードを生成する場合の注意点として、「リードの割り当てルール」が動かないということが挙げられます。
その場合、以下の記事で紹介している回避策を取ることになります。
『ApexやAPI経由で作成されたリードへの「リード割り当てルール」適用』
本記事におけるOAuth認証フローに関して一言
Salesforceには利用可能なOAuth認証フローが複数ありますが、本記事で利用するのはユーザ名パスワードフローです。
一般にユーザパスワードフローはユーザのログイン情報のやり取りが発生するため、セキュリティの観点からは他のOauth認証フローの方が望ましいとされています。
設定手順概要
①インテグレーション用プロファイル&ユーザの作成
②接続アプリケーションの作成
③アクセストークンの取得
④POSTリクエスト送信
手順1:インテグレーション用プロファイル&ユーザの作成
外部に対してAPIを公開する際、どのDBテーブルに対するどの操作までを権限上許すかを設定する必要が一般にあるかと思いますが、SalesforceのAPIを公開する場合における権限設定がまさしくインテグレーション用ユーザのアクセス権です。
またSalesforceにおける特殊事情として、連携の認証情報にユーザのID・パスワード・セキュリティトークンを利用するというものがあります。
従って、インテグレーション用ユーザを作成せずに既存ユーザの情報を用いて連携を実装した場合、当該の認証情報を用いてログインされ、社内の各種情報を盗み出されるリスクが発生します。
結論として、以下の要件を満たすインテグレーション用ユーザの作成がベストプラクティスとなります。
- リソースに対して必要最低限のアクセス権を持つ
- 「APIの有効化」権限を持つ(=API経由でのSFへのアクセスが可能である)
- 「API限定」権限を持つ(=API経由でのみSFへのアクセスが可能である)
- IPアドレスが指定されている(=指定されたIPアドレスからのみSFへのアクセスが可能である)
今回はリードをPOSTするだけなので、簡易的に以下の要件を満たすインテグレーション用ユーザを作成したいと思います。
- リードのINSERT権限のみを有する
- API経由でのSFへのアクセスが可能
※ちなみに、「API限定」権限はDeveloperEditionでは付与できず、画面にも表示されません。
1-1.インテグレーション用プロファイルの作成
a.設定>ユーザ>プロファイルから「新規プロファイル」をクリック

b.「Minimum Access」プロファイルをコピーして、インテグレーション用のプロファイルを作成します。(※他のプロファイルをコピーしても大丈夫ですが、ユーザライセンスは”Salesforce”である必要があります。)

c.「APIの有効化」システム権限を付与

d.リードのINSERT権限を付与

e.「保存」をクリック

1-2.インテグレーション用ユーザの作成
a.設定>ユーザ>ユーザから「新規ユーザ」をクリック

b.必要情報を入力(ユーザライセンス=Salesforce、プロファイル=先ほど作成したプロファイル)し、「保存」をクリック

手順2:接続アプリケーションの作成
a.設定>アプリケーション>Lighitning Bolt>アプリケーションマネージャから「新規接続アプリケーション」をクリック

b.必要な基本情報を入力

c.「OAutch設定の有効化」にチェック
d.任意の「コールバックURL」を入力し、「OAuth範囲」として「データへのアクセスと管理(Access and manage your data)」を選択

e.「保存」をクリック

手順3:アクセストークンの取得
今回は(私の一番使い慣れた)ChromeアドオンのTalend API Testerを利用してSalesforceのAPIを叩いていきたいと思います。
1.セキュリティトークンの取得
a.インテグレーション用ユーザでログイン
b.私の設定>個人用>私のセキュリティトークンのリセットから「セキュリティトークンのリセット」をクリック

c.メールアドレスに届いたセキュリティトークンを取得
2.認証情報の入力
a.HTTPメソッドをPOSTに変更
b.下記のエンドポイントURLを指定
本番環境・DE環境の場合↓
https://login.salesforce.com/services/oauth2/token
Sandbox環境の場合↓
https://test.salesforce.com/services/oauth2/token

b.bodyの形式をFORMに変更
d.下記のフォームパラメータを指定
grant_type | password |
client_id | コンシューマ鍵 |
client_secret | コンシューマの秘密 |
username | SFのユーザ名 |
password | SFのパスワード+セキュリティトークン |
※パスワードがpassword、セキュリティトークンがSecurtyTokenの場合は、上記のpasswordの値としてpasswordSecuryTokenを指定します。
「コンシューマ鍵」と「コンシューマの秘密」は先ほど作成した接続アプリケーションの設定情報から取得可能です

最終形(※ユーザ名とパスワードはSSから外しています)

e.「Send」をクリック

f.レスポンスボディから「アクセストークン(access_token)」を取得

手順4:POSTリクエスト送信
a.下記のエンドポイントURLを指定
https://[インスタンスのURL]/services/data/v25.0/sobjects/[オブジェクト名]
b.HTTPリクエストのメソッドをPOSTであることを確認

c.Headerに下記のAuthorizationのパラメータを追加
Key | Authorization |
Value | Bearer アクセストークン |

d.JSON形式またはXM形式でbodyを記述

d.「Send」をクリック
e.レスポンスで生成されたSalesforceIdが返ってきていることを確認

以上で外部からSFのAPIを叩いてリードを生成することに成功しましたノ