ブラウザと 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.com
pi.pardot.com
Account Engagement Developer Org login.salesforce.com
pi.demo.pardot.com
Sandbox test.salesforce.com
pi.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 更新トークンフロー