#
ドキュメント

Document

自分のための備忘録です。

OAuth 2.0 Web サーバフロー 認証

ブラウザと REST Client( Postman )を使用した Salesforce REST API の OAuth 2.0 Web サーバフロー の例。

公式ドキュメント

Salesforce

Account Engagement

アカウントタイプごとの OAuth 認証ドメイン

アカウント( Production Account、Account Engagement Developer Org、 Sandbox )ごとの OAuth 認証ドメインは以下のとおり。

Account TypeSalesforce DomainAccount Engagement Domain
Production Accountlogin.salesforce.compi.pardot.com
Account Engagement Developer Orglogin.salesforce.compi.demo.pardot.com
Sandboxtest.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 でないと正常に認証できない。

接続アプリケーションを管理する___Salesforce

手順

  1. Salesforce で管理画面で接続アプリケーションを作成
  2. Salesforce で管理画面でリフレッシュトークンの設定
  3. Salesforce でアクセストークンの設定
  4. 接続アプリケーションのコンシューマ鍵client_id )とコンシューマの秘密( client_secret )を使って認証(アクセストークンとリフレッシュトークン)を取得
  5. リフレッシュトークンを使ったアクセストークンの取得( Salesforce でこの処理を更新トークン取得と呼ぶ)
  6. 取得したアクセストークンを使用してデータを操作

Salesforce 管理画面で接続アプリケーションを作成

(やりたいことによるが REST にアクセスするには)スコープは2つで良い。
( REST にアクセスするのに)フルアクセス( full )は必要ないはず。

利用可能な OAuth 範囲

  • データへのアクセスと管理( api )
  • ユーザーに代わっていつでも要求を実行( refresh_token )

上記で書き込みができるかわからないので フルアクセス(full) を追加すると安心。

【重要】 refresh_token を付与しないと refresh_token でアクセストークン更新ができない。具体的にはアクセストークン取得時のレスポンスに refresh_token プロパティが含まれない。

図:アプリケーションマネージャー>編集> 接続アプリケーションを管理

接続アプリケーションを管理する___Salesforce

PCKE を要求の無効化

サポートされる認証フローに Proof Key for Code Exchange (PKCE) 拡張を要求のチェックを外す。

接続アプリケーションを管理する___Salesforce

Salesforce 管理画面でリフレッシュトークンを設定

リフレッシュトークンで更新フローを有効にする

OAuth 2.0 のスコープでユーザーに代わっていつでも要求を実行(refresh_token, offline_access)を選択する。
【重要】 refresh_token を付与しないと refresh_token でアクセストークン更新ができない。具体的にはアクセストークン取得時のレスポンスに refresh_token プロパティが含まれない。

  • 設定:アプリケーションマネージャー>編集>選択した OAuth 範囲>ユーザーに代わっていつでも要求を実行(refresh_token, offline_access)
リフレッシュトークンの有効期限を取り消されるまで有効にする

リフレッシュトークンの設定 接続アプリケーション>接続アプリケーションを管理する>編集>更新トークンポリシー更新トークンは取り消されるまで有効を選択する

Salesforceでアクセストークンの設定

アクセストークンの有効期限は以下順序で決定される。

  1. 接続アプリケーション>接続アプリケーションを管理する>編集>セッションポリシータイムアウト値
  2. ↑でタイムアウトが指定されていないときは、ユーザープロファイルセッションタイムアウトの開始条件の値

図:接続アプリケーション>接続アプリケーションを管理する>編集

Lightning_Experience___Salesforce

図:ユーザープロファイル

プロファイル___Salesforce

アクセストークンとリフレッシュトークンを取得

1. 認証コードを取得

必要情報
  • メソッド: GET
  • エンドポイント: https://login.salesforce.com/services/oauth2/authorize
  • クエリ(必須は以下3つ)
    • response_type: code
    • client_id:コンシューマ鍵`[^1]
    • redirect_uri:接続アプリケーション > プリケーションマネージャー > 参照 > 接続アプリケーションを管理する > コールバック UR で設定した URL[^2]
      • scope: api refresh_token

[^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
  • URL にブラウザでアクセスすると Salesforce 認可ダイアログに遷移
  • 認可する redirect_uri に認証コードが付与されてリダイレクト

リダイレクト例:

# redirect_url に http://locahost/oauth/callback:8080 を設定済みと仮定する
http://locahost/oauth/callback:8080?code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2. アクセストークン / リフレッシュトークンを取得

  • メソッド: POST
  • エンドポイント: https://login.salesforce.com/services/oauth2/token
  • ボディ部クエリ
    • grant_type: authorization_code
    • client_id:コンシューマ鍵[^1]
    • client_secret:コンシューマの秘密[^1]
    • redirect_uri:接続アプリケーション > プリケーションマネージャー > 参照 > 接続アプリケーションを管理する > コールバック UR で設定した URL[^2]
    • code: 「1. 認証コードを取得」で取得したコード
    • リダイレクトURLに付与された認証コードは、パーセントエンコードされているのでデコードする(例: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",
    ...
    ...
}    

postman

リフレッシュトークンを使ったアクセストークンの取得

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

  • アクセストークンは(接続アプリケーションの設定にもよるが)有効期限あり
  • リフレッシュトークンは(接続アプリケーションの設定にもよるが)有効期限なし
  • アクセストークンの有効期限が過ぎている場合はリフレッシュトークンを使ってアクセストークンを取得