ブラウザと REST Client( Postman )を使用した Salesforce REST API の OAuth 2.0 Web サーバフロー の例。
アカウント( Production Account、Account Engagement Developer Org、 Sandbox )ごとの OAuth 認証ドメインは以下のとおり。
Account Type Salesforce Domain Account Engagement Domain Production Account login.salesforce.compi.pardot.comAccount Engagement Developer Org login.salesforce.compi.demo.pardot.comSandbox test.salesforce.compi.demo.pardot.com
ref. Oauth Authentication Domain by Account Type
Salesforce Domain は SalesCloud を契約している場合で Account Engagement Domain は Account Engagement 単体で契約している場合のドメイン?
Sandobox は後述する 認証エンドポイントが login.salesforce.com ではなく test.salesforce.com でないと正常に認証できない。
コンシューマ鍵( client_id )とコンシューマの秘密( client_secret )を使って認証(アクセストークンとリフレッシュトークン)を取得Salesforce でこの処理を更新トークン取得と呼ぶ)(やりたいことによるが REST にアクセスするには)スコープは2つで良い。
( REST にアクセスするのに)フルアクセス( full )は必要ないはず。
上記で書き込みができるかわからないので フルアクセス(full) を追加すると安心。
【重要】 refresh_token を付与しないと refresh_token でアクセストークン更新ができない。具体的にはアクセストークン取得時のレスポンスに refresh_token プロパティが含まれない。
図:アプリケーションマネージャー>編集> 接続アプリケーションを管理
サポートされる認証フローに Proof Key for Code Exchange (PKCE) 拡張を要求のチェックを外す。
OAuth 2.0 のスコープでユーザーに代わっていつでも要求を実行(refresh_token, offline_access)を選択する。
【重要】 refresh_token を付与しないと refresh_token でアクセストークン更新ができない。具体的にはアクセストークン取得時のレスポンスに refresh_token プロパティが含まれない。
アプリケーションマネージャー>編集>選択した OAuth 範囲>ユーザーに代わっていつでも要求を実行(refresh_token, offline_access)リフレッシュトークンの設定 接続アプリケーション>接続アプリケーションを管理する>編集>更新トークンポリシーで更新トークンは取り消されるまで有効を選択する
アクセストークンの有効期限は以下順序で決定される。
接続アプリケーション>接続アプリケーションを管理する>編集>セッションポリシーのタイムアウト値プロファイルのセッションタイムアウトの開始条件の値図:接続アプリケーション>接続アプリケーションを管理する>編集
図:ユーザープロファイル
コールバック UR で設定した URL[^2] [^1]: 鍵などの情報は、接続アプリケーション > プリケーションマネージャー > 参照 > 接続アプリケーションを管理する > コンシューマ鍵 から参照する。アプリケーション > 接続アプリケーション > 接続アプリケーションの管理では表示されない。
[^2]: アクセスできる URL なら良い(テストなら https://example.com/oauth/callbak や (起動していれば)ローカルサーバ http://localhost:8080 などで良い)
リクエスト例(ブラウザでアクセス):
https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id={{ client_id }}&redirect_uri={{ redirect_url }}&scope=api%20refresh_token
リダイレクト例:
# redirect_url に http://locahost/oauth/callback:8080 を設定済みと仮定する
http://locahost/oauth/callback:8080?code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
コールバック UR で設定した URL[^2] 認証コードは、パーセントエンコードされているのでデコードする(例:PHP urldecode())リクエスト例( 本記事は Postman の使用を想定しているがイメージを掴むために cURL のリクエストを記載)
curl --location 'https://login.salesforce.com/services/oauth2/token' \
--header 'Cookie: BrowserId=xxxxxxxxxxx; CookieConsentPolicy=0:0; LSKey-c$CookieConsentPolicy=0:0' \
--form 'grant_type="authorization_code"' \
--form 'client_id="{{ client_id }}"' \
--form 'client_secret="{{ client_sectret }}"' \
--form 'redirect_uri="http://localhost:8080/oauth/callback"' \
--form 'code="{{ code }}"'
レスポンス:
{
"access_token": "0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"refresh_token": "5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"signature": "Cxxxxxxxxxxxxxxxxxxxxxxxx",
...
...
}

ref. 更新セッションの OAuth 2.0 更新トークンフロー