-
Notifications
You must be signed in to change notification settings - Fork 0
MS_TokenRevocation
- 戻る(OAuth 2.0 拡張)
- OAuth 2.0 Token Introspection
- OAuth 2.0 Token Revocation
-
OAuth 2.0 のトークン(
refresh_token,access_token)を
無効化するメカニズムでコア仕様を補足 -
取消し要求は、当該トークンと、該当する場合、
同じ authorization grant の他のトークンを無効化する。 -
この動作により、
- Resource Owner が認識していない、
- 特定の Client に対して有効な、
- authorization grant がまだ存在する状況が回避される。
- トークンの悪用を防ぐ。
- より良い UX を促進する。
- Resource Owner がサインアウトした場合。
- Resource Owner が ID を変更した場合。
- Client をアンインストールした場合。
- Client は Authorization Server の Revocation Endpoint URL へ
トークンが必要でなくなったことを通知する。 - Authorization Server は、そのトークンに関連するデータ、
authorization grant をクリーンアップする。
移行メモ(誤字): 元ページの「Resource Owner がが」は重複である。
- Authorization Endpoint の規則と同様
- HTTP 要求の平文認証情報の送信
- SSL/TLS(サーバ証明)の利用
- 自動検出など、URL を取得する手段は、この仕様の範囲外
- CORSをサポートしても良い。
HTTP POST 要求(application/x-www-form-urlencoded)を使用して、
以下のパラメタを Revocation Endpoint に送信する。
-
token(必須):取り消したいトークン -
token_type_hint(オプション):失効のためのトークンのタイプに関するヒント-
access_token/refresh_token - 無効なトークン・タイプは無視される。
-
POST /revoke HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token
- クライアント認証
- トークン検証
- トークン無効化
- 直ちに無効化され、トークン再使用不可(使用禁止)
- 実際には、伝播遅延が存在する可能性がある。
- 関連するトークンおよびその基礎となる認可付与の無効化
-
access_token:合わせて、refresh_tokenも無効化できる(MAY)。 -
refresh_token:同じ authorization grant に基づく
全access_tokenを無効化する。
-
補足(この非対称性が重要):
refresh_tokenを失効させると
紐づく全access_tokenも失効するが、逆は任意(MAY)である。
失効させるもの 影響 refresh_tokenその grant の全 access_tokenも失効(SHOULD)access_tokenrefresh_tokenも失効させてよい(MAY)「ログアウトしたら全部切る」という要件なら、
refresh_tokenを失効させるのが正しい。
access_tokenだけ失効させても、
Client がrefresh_tokenで再取得できてしまう。
- 成功
- HTTP status code 200
- レスポンス本文の内容は無し。
- 失敗
- ケース: クライアント認証に失敗 / トークン検証に失敗
- レスポンス: HTTP status code 503
追加エラー コードunsupported_token_type
(提示されたトークン・タイプの取り消しをサポートしない)
移行メモ(正誤): 元ページは失敗時を「HTTP status code 503」と
しているが、RFC 7009 の定義は次のとおりである。
ケース ステータス クライアント認証に失敗 401 Unauthorized unsupported_token_type400 Bad Request サーバ側の一時的な事情 503 Service Unavailable( Retry-After付き)503 は「一時的に処理できない」場合の話であり、
認証失敗やトークン種別の非対応とは別である。
補足(無効なトークンでも 200): Introspectionと
同様、存在しない・既に失効しているトークンを渡されても 200 を返す
のが仕様である(RFC 7009)。
「そのトークンは存在しない」と教えてしまうと、
トークンの有効性を判定する手段を与えることになるためである。
-
access_tokenは自己完結型であるため、- トークン・ハンドル化するか、
-
jtiクレームを追加するか、
など、何らかの ID を付与する必要がある。
-
トークン・ハンドル化や
jtiクレームを追加した場合、
Authorization Server, Resource Server 間の
バックエンドに、いくつかの(非標準化)相互作用が必要になる。
- トークン・ハンドルや
jtiなどの ID の導入で、
無効化された ID を管理する実装が無難。 - 危ない場合は、攻撃に関わる Client や Resource Owner の削除を行うで良い気もする。
- 必要に応じて、Resource Server も Client や Resource Owner の
チェックを行うと良いかと思う。
補足(自己完結型トークンの失効という難問): この節が指摘するとおり、
JWT形式のアクセス トークンは原理的に「失効できない」。
署名が正しく期限内なら、Resource Server は有効と判定してしまう。実務での対処は次の 3 つに整理できる。
方針 内容 コスト 有効期限を短くする 5〜15 分。 refresh_tokenで更新最も簡単。実務の第一選択 失効リスト(denylist) 失効した jtiを共有ストア(Redis 等)に置き、RS が毎回照会自己完結型の利点を失う Introspectionに切り替える ハンドル型にする 性能を犠牲にする 「即時失効が本当に必要か」を要件として確認し、
必要でないなら有効期限を短くするだけで済ませるのが
最も見通しがよい。
-
RFC 7009 - OAuth 2.0 Token Revocation
https://datatracker.ietf.org/doc/html/rfc7009 -
OAuth 2.0 Token Revocation(日本語訳)
https://openid-foundation-japan.github.io/rfc7009.ja.html -
OAuth 2.0のToken無効化に関する仕様について調べた - r-weblife
https://ritou.hatenablog.com/entry/20110323/1300888935
Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, OAuth
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。