コンテンツにスキップ

実運用でのトークンライフサイクル

どのOAuthフローガイドにもrefresh_tokenは登場しますが、多くのリクエスト・ワーカー・日数にわたって稼働し続ける長期的なインテグレーションでは、「期限が来たらトークンを差し替える」だけでは不十分です。このページでは、実際のトークン有効期間、複数ワーカー間でのトークンのキャッシュ方法、更新のタイミング、そして本来の期限より前にトークンが無効化される要因を扱います。


フローごとのトークン有効期間

Section titled “フローごとのトークン有効期間”

アクセストークンの有効期間はすべてのフローで共通の固定値です。一方リフレッシュトークンの有効期間はそうではなく、どのOAuthフローが発行したかによって異なります。

フローアクセストークンのTTLリフレッシュトークンのTTL
Client Credentialsフロー約1時間約30日
ネイティブアプリケーションフロー(PKCE、ループバックリダイレクト)約1時間固定の有効期限なし:ローテーションで置き換えられるか失効するまで有効
Authorization Code + Custom Redirect Flow約1時間固定の有効期限なし:ローテーションで置き換えられるか失効するまで有効

トークンをキャッシュする(リクエストごとに新規発行しない)

Section titled “トークンをキャッシュする(リクエストごとに新規発行しない)”

APIコールのたびに、あるいは各ワーカープロセスで独立にアクセストークンを新規発行することは可能ですが、すでに約1時間有効なトークンのために、リクエストごとに往復を無駄にしてしまいます。トークンを1つ取得し、発行元の認証情報をキーとしてキャッシュし(単一プロセスならメモリ上、ワーカー群であればRedisなどの共有ストアに)、期限が近づくまではすべてのリクエストにそのキャッシュ済みトークンを渡してください。

これはリフレッシュトークンにとっても重要です。独立に交換するプロセスが少ないほど、以下で説明する競合状態に陥る可能性は低くなります。

401だけでなく有効期限で更新する

Section titled “401だけでなく有効期限で更新する”

アクセストークンのTTLは固定で事前にわかっているため、プロアクティブに更新してください。トークンを取得した時刻を記録するか(あるいはexpクレームをデコードして)、その直前に新しいトークンを要求します。リクエストが失敗するのを待ってから対応するのではありません。

とはいえフォールバックとして失敗したリクエストへの対応も用意し、受け取ったエラーによって処理を分けてください。

  • not_authenticatedを伴う401:リクエストに利用可能なベアラートークンがまったく含まれていませんでした。これはクライアント側の不具合(Authorizationヘッダーの欠落や不正な形式)であり、更新すべきサインではありません。
  • invalid_tokenを伴う401:トークンの署名または有効期限のチェックに失敗しました。更新して一度だけ再試行してください。
  • 403:トークンの問題であることは決してありません。トークンは有効ですが、呼び出し元がその操作に必要なスコープ、コンテンツアクセス権、またはロールを持っていません。更新しても解決しません。各コードの詳細はエラーコード:レート制限・認証・アクセス制御を参照してください。

リフレッシュトークンは1回限りです。grant_type=refresh_tokenで交換すると、そのリフレッシュトークンは無効化され、新しいアクセストークンと新しいリフレッシュトークンが同時に発行されます。複数のワーカーが同じキャッシュ済みリフレッシュトークンを共有していて、そのうち2つがほぼ同時に更新を試みた場合、成功するのは一方の交換だけです。もう一方は「使用済み」と区別できる特別なエラーではなく、汎用的な401を受け取ります。

トークンが早期に無効化される要因

Section titled “トークンが早期に無効化される要因”

以下のいずれの出来事も、有効なアクセストークンを直接失効させるわけではありません。それぞれがブロックするのは新規の何か(新しいトークン要求や次回の更新)であり、すでに手元にあるアクセストークンは自身のTTLが尽きるまで機能し続けます。

要因影響
OAuthアプリケーションのクライアントシークレットがローテーションされた古いシークレットを使った新しいトークン要求や更新要求は直ちに拒否されます。すでに発行済みのアクセストークンには影響がなく、自然に期限切れになるまで機能し続けます。
OAuthアプリケーションまたはそのサービスユーザーが削除されたそのアプリケーション向けの新しいトークン発行がブロックされます。すでに発行済みのトークンは積極的には失効されません。
OAuthアプリケーションのスコープが変更されたすでに発行済みのアクセストークンは、残りの有効期間中は元のスコープを保持します。トークンが新しいスコープを取得するのは、次回更新または再発行されたときだけです。
グラントが明示的に失効された次回の更新試行は直ちにブロックされます。まだ有効なアクセストークンは強制的に失効させられず、自然に期限切れになるまで機能し続けます。