このページは Authlete 2.x 向けのドキュメントです。3.0 の内容はRFC 8693 OAuth 2.0 Token Exchange(3.0)をご覧ください。
はじめに
RFC 8693 OAuth 2.0 Token Exchange (以下 “Token Exchange”) は、トークンエンドポイントに既存のトークンを提示して新しいトークンを取得する方法を定義している技術仕様です。 当仕様はとても柔軟ですが、安全なトークン交換に必要となる詳細事項については定義されていません。そのため、同仕様を認可サーバーに実装する際には、未定義部分に関する詳細仕様化が必要です。 本記事では、Token Exchange 仕様を用いる場合の詳細仕様化の要点と、Authlete 2.x における同仕様のサポートについて説明します。仕様
次の図はトークン交換フローを示しています。
トークンの種別
トークン交換フローにおいて入力として提示するトークンには、サブジェクトトークン (Subject Token) と アクタートークン (Actor Token) の 2 種類があります。- サブジェクトトークン: 必須。リクエストの当事者のアイデンティティを表す。
- アクタートークン: 任意。代行者のアイデンティティを表す。
トークンタイプ
仕様は次のトークンタイプ識別子を定義しています。| トークンタイプ | トークンタイプ識別子 |
|---|---|
| JWT | urn:ietf:params:oauth:token-type:jwt |
| アクセストークン | urn:ietf:params:oauth:token-type:access_token |
| リフレッシュトークン | urn:ietf:params:oauth:token-type:refresh_token |
| ID トークン | urn:ietf:params:oauth:token-type:id_token |
| SAML 1.1 / 2.0 | urn:ietf:params:oauth:token-type:saml1 / saml2 |
トークン交換リクエスト
- グラントタイプ:
urn:ietf:params:oauth:grant-type:token-exchangeをgrant_typeに指定。 - 主なパラメーター:
subject_token,subject_token_type(必須)、actor_token,actor_token_type(任意)、resource,audience,scope,requested_token_type(任意)。
トークン交換レスポンス
access_token,issued_token_type,token_typeが必須。expires_in,scope,refresh_tokenは任意。
Authlete 2.x における対応
Token Exchange は Authlete 2.3 以降でサポートされます。- トークンリクエストを
/auth/tokenAPI に送信すると、grant_typeがurn:ietf:params:oauth:grant-type:token-exchangeでバリデーションをパスした場合、actionとしてTOKEN_EXCHANGEが返却されます。 - トークン交換レスポンスの生成には
/auth/token/createAPI を用い、grantTypeにTOKEN_EXCHANGEを指定します。
トークンのバリデーション
Authlete はsubject_token / actor_token のトークンタイプに応じてバリデーションを行います(JWT・アクセストークン・リフレッシュトークン・ID トークン・SAML など)。詳細は Authlete ウェブサイトの Token Exchange ページ(2.x) を参照してください。
関連する設定項目(2.x)
- サービス設定: 特定可能なクライアントのみ、コンフィデンシャルクライアントのみ、許可されたクライアントのみ、暗号化/無署名 JWT の拒否など。
- クライアント拡張:
tokenExchangePermittedでトークン交換を明示的に許可。
利用例
トークン交換の実装例は authlete-java-jaxrs のTokenRequestHandler.java および java-oauth-server の TokenExchanger.java を参照してください。