0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Salesforce】OAuth 2.0更新トークンフローはどのフローで使えるのか

0
Posted at

OAuth 2.0 の学習をしていると、更新トークンフローについて次のような問題に出会うことがあります。

更新トークンフローを適用できる OAuth フローはどれか?

Salesforce の文脈では、代表的には次のように整理されます。

フロー 更新トークンフローを使えるか
Webサーバーフロー 使える
ユーザーエージェントフロー 使える
JWTベアラートークンフロー 使えない
ユーザー名・パスワードフロー 使えない

最初は少しわかりにくいですが、判断基準はシンプルです。

そのフローで refresh_token が発行されるか?

更新トークンフローは、すでに持っている refresh_token を使って、新しい access_token を取得するためのフローです。

そのため、そもそも refresh_token が発行されないフローでは、更新トークンフローは使えません。


更新トークンフローとは

更新トークンフローは、期限切れになった access_token を、refresh_token を使って再発行する仕組みです。

access_token は API を呼び出すためのトークンです。ただし、セキュリティ上の理由から有効期限は短めに設定されます。

一方で、毎回ユーザーにログインしてもらうと使い勝手が悪くなります。そこで使われるのが refresh_token です。

oauth-refresh-token-flow-simple.png

流れとしては、次のようになります。

  1. 初回認証で access_tokenrefresh_token を取得する
  2. access_token を使って API を呼び出す
  3. access_token が期限切れになる
  4. refresh_token を使って新しい access_token を取得する
  5. 新しい access_token で API 呼び出しを継続する

ここで重要なのは、更新トークンフローは「最初のログインに使うフロー」ではないという点です。

最初に別の OAuth フローで refresh_token を取得しておき、その後 access_token が期限切れになったタイミングで使います。


Webサーバーフローで使える理由

Webサーバーフローは、ユーザーがログインし、アプリケーションへのアクセスを許可する標準的な OAuth フローです。

Salesforce では、適切なスコープを指定することで、アプリケーションは access_token と一緒に refresh_token を取得できます。

そのため、アクセストークンが期限切れになった後も、次のように再発行できます。

refresh_token
  -> 新しい access_token

つまり、Webサーバーフローは refresh_token を取得できるため、更新トークンフローの対象になります。


ユーザーエージェントフローで使える理由

ユーザーエージェントフローも、ユーザーのログインと認可を前提にしたフローです。

Salesforce の更新トークンフローは、Webサーバーフローまたはユーザーエージェントフローで発行されたアクセストークンを更新するものとして説明されています。

そのため、模擬問題や試験対策の文脈では、ユーザーエージェントフローも更新トークンフローの対象として扱います。

ただし、ユーザーエージェントフローはアクセストークンがブラウザやモバイルアプリ側に露出しやすい方式です。

現在の実装では、セキュリティ上の理由から Webサーバーフロー + PKCE を検討する場面が多くなっています。


JWTベアラートークンフローで使えない理由

JWTベアラートークンフローは、refresh_token でアクセストークンを更新するフローではありません。

このフローでは、クライアントが証明書で署名した JWT を作成し、それを Salesforce のトークンエンドポイントに送信します。

Salesforce は JWT の署名や内容を検証し、問題がなければ access_token を発行します。

つまり、アクセストークンを再取得する方法はこうです。

新しい署名付きJWTを作る
  -> Salesforceに送る
  -> access_token を取得する

refresh_token を使っているわけではありません。

そのため、JWTベアラートークンフローでは更新トークンフローを使えません。

ここでのポイントは、「アクセストークンを再取得できない」という意味ではないことです。

JWTベアラートークンフローでは、アクセストークンの再取得方法が refresh_token ではなく、署名付き JWT になっているだけです。


ユーザー名・パスワードフローで使えない理由

ユーザー名・パスワードフローは、クライアントがユーザー名とパスワードを直接送信して access_token を取得するフローです。

Salesforce のユーザー名・パスワードフローは、refresh_token をサポートしません。

そのため、アクセストークンを再取得したい場合は、再びユーザー名とパスワードを使ってトークンを取得する形になります。

refresh_token を使う

のではなく、

ユーザー名・パスワードを使う

という考え方です。

ただし、この方式はユーザーの認証情報をアプリケーション側で扱うため、セキュリティ上のリスクが高いです。

Salesforce でも、ユーザー名・パスワードフローは特別なシナリオ向けであり、現在は避けるべきフローとして扱われています。


まとめ

更新トークンフローが使えるかどうかは、次の基準で考えるとわかりやすいです。

refresh_token が発行されるフローかどうか

改めて整理すると、次のようになります。

フロー 更新トークンフロー 理由
Webサーバーフロー 使える refresh_token を取得できる
ユーザーエージェントフロー 使える Salesforce の更新トークンフローの対象
JWTベアラートークンフロー 使えない 署名付き JWT で access_token を取得する
ユーザー名・パスワードフロー 使えない refresh_token をサポートしない

試験対策としては、次のように覚えるとよさそうです。

更新トークンフローは、refresh_token が発行された後に使うフロー。
JWTベアラーは JWT で再取得する。
ユーザー名・パスワードは認証情報で再取得する。

「アクセストークンを再取得できるか」ではなく、「refresh_token を使って再取得する設計か」で見ると、整理しやすくなります。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?