GET /resource HTTP/1.1 Host: frontend.example.com Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
| RFC 8693 | OAuth 2.0 トークン交換 | 2020年1月 |
| Jones ほか | 標準化過程 | [ページ] |
この仕様は、OAuth 2.0 認可サーバーからセキュリティトークンを 要求して取得する方法を定義することにより、HTTP および JSON ベースの Security Token Service (STS) のプロトコルを定義します。 これには、なりすましおよび委任を使用するセキュリティトークンも含まれます。¶
これはインターネット標準化過程の文書です。¶
この文書はインターネット技術タスクフォース (IETF) の成果物です。これは IETF コミュニティの合意を表しています。公開 レビューを受け、インターネット技術運営グループ (IESG) によって公開が承認されています。インターネット標準に関する詳細な 情報は RFC 7841 の第2節で参照できます。¶
この文書の現在の状況、すべての 正誤情報、およびフィードバックの提供方法に関する情報は、 https://www.rfc-editor.org/info/rfc8693 で入手できます。¶
Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.¶
セキュリティトークンとは、異種環境または異なる セキュリティドメイン間でのアイデンティティ情報およびセキュリティ情報の共有を容易にする情報の集合です。 セキュリティトークンの例には、JSON Web Token (JWT) [JWT] および Security Assertion Markup Language (SAML) 2.0 アサーション [OASIS.saml-core-2.0-os] があります。 セキュリティトークンは 通常、完全性を確保するために署名され、場合によっては 機密性を確保するために暗号化もされます。セキュリティトークンは、[RFC7521] のように、 アサーションと呼ばれることもあります。¶
Security Token Service (STS) は、提供された セキュリティトークンを検証し、それに応答して新しいセキュリティトークンを 発行できるサービスであり、これによりクライアントは異種環境または異なるセキュリティ ドメインにあるリソースに適したアクセス資格情報を取得できます。 Web サービスのクライアントは、トークン交換のために STS と対話するプロトコルとして WS-Trust [WS-Trust] を使用してきました。 WS-Trust は XML と SOAP を使用しますが、現代の Web 開発の傾向は RESTful (Representational State Transfer) パターンおよび JSON へと移っています。 OAuth 2.0 Authorization Framework [RFC6749] および OAuth 2.0 Bearer Tokens [RFC6750] は、サードパーティー アプリケーションによる HTTP および RESTful リソースへのアクセスを認可するための一般的な標準として普及しています。 従来の OAuth 2.0 の対話では、リソース所有者の認可を何らかの 形で表現したものをアクセストークンと交換します。 これは実際に極めて有用なパターンであることが実証されています。しかし、 その入力と出力は、そのままではセキュリティトークン交換フレームワークを完全に 収容するにはやや制約が強すぎます。¶
この仕様は OAuth 2.0 を拡張するプロトコルを定義し、 クライアントが STS の役割を担う認可サーバーから セキュリティトークンを要求して取得できるようにします。 OAuth 2.0 と同様に、この仕様はクライアント開発者にとっての簡潔性を重視し、 現代の開発環境でほぼ普遍的に利用可能な HTTP クライアントと JSON パーサーのみを 必要とします。この仕様で定義する STS プロトコル 自体は RESTful ではありません(STS は REST アプローチに特に適しているわけではありません)が、RESTful システムでの作業に慣れた 開発者には馴染み深いはずの通信パターンとデータ形式を使用します。¶
トークン交換要求のための新しいグラントタイプと、 トークンエンドポイントへのそのような要求に関連する固有のパラメーターを、この仕様で定義します。 トークン交換応答はトークンエンドポイントからの通常の OAuth 2.0 応答であり、 クライアントに情報を提供するために、ここで定義するいくつかの追加パラメーターを含みます。¶
トークン交換を要求するエンティティは、トークン交換の対話の 文脈ではクライアントとみなされます。ただし、これは このプロファイルの使用を従来の OAuth クライアントに限定するものではありません。たとえば OAuth リソースサーバーは、 保護リソース要求で受信した アクセストークンを、バックエンド サービスの呼び出しに含めるのに適した新しいトークンと交換するため、トークン交換中にクライアントの役割を担うことができます。 新しいトークンは、ダウンストリームサービス向けに より狭いスコープを持つアクセストークンである場合も、まったく異なる種類の トークンである場合もあります。¶
この仕様の範囲は、OAuth 2.0 を利用する STS 形式のトークン交換のための基本的な要求・応答プロトコルの定義に限定されます。 委任セマンティクスを表現できるいくつかの新しい JWT クレームを定義しますが、 トークン自体の具体的な構文、セマンティクス、セキュリティ特性 (認可サーバーに提示されるものとクライアントが取得するものの両方)は 明示的に範囲外であり、実装が配備される可能性のある 信頼モデルについても要件を課しません。追加のプロファイルでは、 関係する当事者や信頼の具体的な性質について、 トークンの署名および/または暗号化が必要か、proof-of-possession 形式の トークンが要求または発行されるかなど、より詳細な要件を定めることができます。しかし、このような詳細は 多くの場合、個々の配備の具体的なニーズに基づいて決定されるポリシーであり、 それに応じて構成または実装されます。¶
取得したセキュリティトークンはさまざまな文脈で使用できますが、 その具体的な内容もこの仕様の範囲外です。¶
STS の一般的なユースケースの一つ(前節で触れたように)は、 リソースサーバー A が要求元ユーザー B に代わってバックエンドサービス C を 呼び出せるようにすることです。ローカルサイトのポリシーおよび 認可インフラストラクチャによっては、A が自らの 資格情報を使用して C にアクセスし、A が B に代わって行動していることを何らかの形で示す 注記を付ける(「委任」)か、A に C への限定的なアクセス 資格情報を付与しながら、B を認可された エンティティとして引き続き識別する(「なりすまし」)ことが望ましい場合があります。委任となりすましは、 複数の参加者が関与する他のシナリオでも有用な概念となり得ます。¶
プリンシパル A がプリンシパル B になりすます場合、A には 定義された権利の文脈内で B が持つすべての 権利が与えられ、その文脈内では B と区別できません。 したがって、プリンシパル A がプリンシパル B になりすます場合、そのような トークンを受け取るエンティティから見れば、実際には B とやり取りしていることになります。アイデンティティ システムの一部の構成員が、なりすましが行われていることを認識している場合もありますが、 それは要件ではありません。 実質的に、A が B になりすましている場合、トークンによって認可された 権利の文脈において A は B です。A が B になりすます能力は、 トークンの内容または帯域外の仕組みによって、 スコープや時間が制限されたり、さらには一回限りの使用に制限されたりする場合があります。¶
委任のセマンティクスは なりすましのセマンティクスとは異なりますが、両者は密接に関連しています。 委任のセマンティクスでは、プリンシパル A は B とは別個の 自らのアイデンティティを保持し、B が 自らの権利の一部を A に委任している場合でも、行われるあらゆる操作は B を代表する A によって行われることが明示的に理解されます。ある意味で、A は B の代理人です。¶
委任となりすましがすべての状況を包含するわけではありません。 たとえば、プリンシパルが自らのために直接行動する場合、 委任もなりすましも関与しません。しかし、これらは トークン交換でより一般的に用いられるセマンティクスであるため、 この仕様ではより直接的に扱われます。¶
委任のセマンティクスは通常、トークンの主要な
サブジェクトと、そのサブジェクトから権利の一部を委任されたアクターの両方に関する情報を含めることで、
トークン内に表現されます。
このようなトークンは、複数のサブジェクトに関する情報から構成されるため、
複合トークンと呼ばれることがあります。通常、要求では subject_token が
トークンの要求対象となる当事者の
アイデンティティを表し、actor_token は
発行されるトークンのアクセス権が委任される当事者のアイデンティティを表します。
認可サーバーによって発行される複合トークンには、両方の
当事者に関する情報が含まれます。
複合トークンをいつ、そして実際に発行するかどうかは、認可サーバーと
適用されるポリシーおよび構成の裁量に委ねられます。¶
複合トークンをどのように表現するか、さらにはそのようなトークンを
発行するかどうかの詳細は、実装の詳細
およびトークンの種類に依存します。JWT ではない複合トークンの表現は、
この仕様の範囲外です。ただし、actor_token 要求
パラメーターは、
望ましいアクターに関する情報を提供する手段を提供し、JWT の
act クレームは
委任チェーンを表現できます。¶
クライアントは、第 4.5節 of [RFC6749] で定義された拡張グラントタイプの仕組みを使用して、 認可サーバーのトークンエンドポイントにトークン要求を行うことにより、 セキュリティトークンを要求します。¶
認可サーバーに対するクライアント認証は、OAuth 2.0 が提供する通常の 仕組みを使用して行われます。 第 2.3.1節 of [RFC6749] はクライアントのパスワードベース認証を 定義していますが、クライアント認証は拡張可能であり、他の仕組みも使用できます。 たとえば、[RFC7523] は Bearer JSON Web Token (JWT) [JWT] を使用するクライアント認証を定義しています。 サポートされるクライアント認証方法、および 認証されていない、または識別されていないクライアントを許可するかどうかは、 認可サーバーの裁量による配備上の決定です。 クライアント認証を省略すると、 侵害されたトークンを所持する者であれば誰でも、STS を介してそのトークンを他のトークンへ 利用できることに注意してください。したがって、クライアント 認証により、どのエンティティが他の エンティティになりすましたり、他のエンティティから委任を受けたりすることを許可されるかについて、 STS が追加の認可チェックを行えるようになります。¶
クライアントは、HTTP POST メソッドを使用して、拡張
グラントタイプによるトークン交換要求をトークンエンドポイントに行います。
次のパラメーターは、
付録 B
of [RFC6749] に記述されているとおり、UTF-8 の文字エンコーディングを使用した
application/x-www-form-urlencoded
形式で HTTP 要求のエンティティ本体に含められます。¶
urn:ietf:params:oauth:grant-type:token-exchange
は、トークン交換が実行されていることを示します。¶
resource パラメーターにより、クライアントはトークン交換要求内で、
通常は https
URL として位置を指定し、そのリソースへのアクセスに使用するのと同じ形式で、
発行されたトークンをどこで使用する予定かを認可
サーバーに示せます。
認可サーバーは通常、リソース URI 値から
適切なポリシーへマッピングする機能を持ちます。resource パラメーターの値は、第
4.3節 of [RFC3986] で指定されている
絶対 URI でなければならず、
クエリコンポーネントを含んでもよいですが、フラグメントコンポーネントを含んではなりません
。
複数の resource パラメーターを使用して、
発行されたトークンが列挙された複数のリソースで使用されることを意図していることを示せます。
resource パラメーターの追加の背景情報および用途については、
[OAUTH-RESOURCE]
を参照してください。¶
resource パラメーターと同様の目的を果たしますが、クライアントが
対象サービスの論理名を提供します。その
名前を解釈するには、値がクライアントと
認可サーバーの双方に理解できるものである必要があります。OAuth クライアント識別子、SAML エンティティ
識別子 [OASIS.saml-core-2.0-os]、および OpenID Connect
発行者識別子 [OpenID.Core] は、
audience パラメーターの値として使用できるものの例です。
ただし、特定の
認可サーバーで使用される audience 値は、
意図した種類の値として正しく解釈されるよう、そのサーバー内で一意でなければなりません。複数の
audience パラメーターを使用して、
発行されたトークンが列挙された複数のオーディエンスで使用されることを
意図していることを示せます。audience パラメーターと resource パラメーターは、
論理名とリソース URI を組み合わせて
複数の対象サービスを示すために併用できます。¶
resource または
audience パラメーターで示されるサービスまたはリソースの
要件に関する知識によって決定されることがあります。¶
subject_token パラメーター内の
セキュリティトークンのタイプを示す、
第3節で記述されている識別子です。¶
actor_token パラメーター内の
セキュリティトークンのタイプを示す、
第3節で記述されている識別子です。
actor_token パラメーターが要求に存在する場合は
必須ですが、それ以外の場合は含めてはなりません。¶
要求を処理する際、認可サーバーは、示されたトークン タイプに適した検証手順を実行しなければならず、 アクタートークンが存在する場合は、その示されたトークンタイプに対しても 適切な検証手順を実行しなければなりません。 特定のトークンの有効性基準および詳細は、この文書の範囲外であり、 それぞれのトークンタイプとその内容に固有です。¶
一回限りの使用またはトークンタイプ固有のその他のセマンティクスがない限り、 トークン交換を 実行する行為は、サブジェクトトークンまたはアクタートークンの有効性に影響しません。 さらに、交換は一回限りのイベントであり、入力トークンと出力トークンの間に 強い結び付きを作成しないため、(たとえば)出力トークンの有効期限が 入力トークンの有効期限の影響を受ける場合はあっても、 入力トークンの更新または延長が 出力トークンのプロパティに反映されることは想定されません。 トークン失効イベントを伝播することが適切または望ましい場合もあります。 ただし、これは STS プロトコルの一般的な特性ではなく、 特定の実装、トークンタイプ、または配備に固有のものです。¶
トークンを要求するとき、クライアントは audience および
resource パラメーターを使用して、そのトークンを使用する予定の望ましい対象
サービスを示すことができ、また scope パラメーターを使用して
要求するトークンの望ましいスコープを示すことができます。
このような要求のセマンティクスは、クライアントが要求したすべての対象サービスで使用可能な、
要求されたスコープを持つトークンを要求しているということです。実質的に、トークンに要求される
アクセス権は、
すべての対象サービスにおけるすべてのスコープの直積です。¶
認可サーバーは、いかなるトークン要求についても応じる意思がない、または応じることができない場合がありますが、
非常に広範なアクセス権が
要求されている場合、応じられない要求となる可能性は著しく高くなります。
したがって、配備内のシステム間の関係について具体的な知識がない場合、
クライアントは要求するアクセスの広さ、特に
対象サービスの数について慎重に判断するべきです。認可サーバーは、
第2.2.2節で定義された invalid_target
エラーコードを使用して、クライアントが
同時に多すぎる対象サービスへのアクセスを要求したことを通知できます。¶
認可サーバーは、第5節 of [RFC6749] で指定されているとおり、 トークンエンドポイントからの通常の OAuth 2.0 応答でトークン交換要求に応答します。 追加の詳細と 説明を次の各小節で示します。¶
要求が有効であり、認可サーバーのすべてのポリシーおよびその他の基準を満たす場合、 [RFC8259] で指定された "application/json" メディアタイプと HTTP 200 ステータスコードを使用して、HTTP 応答のエンティティ本体に 次のパラメーターを追加することにより、 成功したトークン応答を構築します。 パラメーターは、それぞれをトップレベルに追加して JavaScript Object Notation (JSON) 構造へシリアライズされます。 パラメーター名と文字列値は JSON 文字列として含められます。 数値は JSON 数値として含められます。 パラメーターの順序は重要ではなく、変わる場合があります。¶
access_token パラメーターは、
ここでは要求された
トークンを運ぶために使用され、これにより、このトークン交換プロトコルは
トークンエンドポイント向けに定義された既存の OAuth 2.0 の要求
および応答の構造を使用できます。
識別子 access_token は歴史的な
理由で使用されており、発行されるトークンは OAuth アクセストークンである必要はありません。¶
Bearer という値は、
発行されたセキュリティトークンがベアラートークンであり、クライアントが
トークン自体の内容以外に適格性を証明する追加の証拠なしで、
そのまま提示できることを示します。この
パラメーターの意味は、発行されたセキュリティトークンの
表現を宣言する issued_token_type
パラメーターの意味とは異なることに注意してください。「トークンタイプ」という用語は、
通常、セキュリティトークンの構造的または構文的な表現を意味するために使用され、
この仕様のすべての *_token_type パラメーターでもその意味で使用されています。
発行されたトークンがアクセストークンではない、またはアクセストークンとして使用できない場合、
token_type 値 N_A
を使用して、その文脈では OAuth 2.0 の token_type
識別子が適用されないことを示します。¶
urn:ietf:params:oauth:grant-type:token-exchange
グラントタイプの要求への応答として、クライアントがどの条件でリフレッシュトークンを
期待すべきかを明確に文書化するべきです。¶
要求自体が有効でない場合、または subject_token もしくは
actor_token のいずれかが何らかの理由で無効であるか、
ポリシーに基づいて受け入れられない場合、認可サーバーは、
第
5.2節 of [RFC6749] で指定されているとおり、
エラー応答を構築しなければなりません。
error パラメーターの値は、
invalid_request エラーコードでなければなりません。¶
認可サーバーが、resource または audience パラメーターで示された
対象サービスに対してトークンを発行する意思がない、または発行できない場合、
エラー応答では invalid_target エラーコードを使用するべきです。¶
認可
サーバーは、第
5.2節 of [RFC6749] で説明されている
error_description を使用して、
エラーの理由に関する追加情報を含めてもよいです。¶
必要に応じて、他のエラーコードも使用できます。¶
次の例は、OAuth リソースサーバーが 交換中にクライアントの役割を担う、仮想的なトークン交換を示しています。 リソースサーバーは、保護リソース要求で受信したアクセストークンを、 バックエンドサービスの呼び出しに使用する新しい トークンと交換します (例中の余分な改行とインデントは表示目的のみです)。¶
図1は、第 2.1節 of [RFC6750] で指定されているとおり、 Authorization ヘッダーに OAuth アクセストークンを含む保護 リソース要求をリソースサーバーが受信する様子を示しています。¶
GET /resource HTTP/1.1 Host: frontend.example.com Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
図2では、リソースサーバーが
トークン交換のクライアントの役割を担い、
図1の要求から得たアクセストークンを、
第2.1節で指定された要求を使用して認可サーバーへ送信します。
subject_token パラメーターの値にはアクセストークンが入り、
subject_token_type パラメーターの値は、
それが OAuth 2.0 アクセストークンであることを示します。クライアントの役割を担うリソースサーバーは、
HTTP Basic 認証方式を使用して、
自身の識別子とシークレットで認可サーバーに対して認証します。
resource パラメーターは、
発行されたトークンが使用されるバックエンドサービス
<https://backend.example.com/api> の位置を示します。¶
POST /as/token.oauth2 HTTP/1.1 Host: as.example.com Authorization: Basic cnMwODpsb25nLXNlY3VyZS1yYW5kb20tc2VjcmV0 Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange &resource=https%3A%2F%2Fbackend.example.com%2Fapi &subject_token=accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC &subject_token_type= urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
認可サーバーは、クライアント資格情報と、トークン
交換要求で提示された subject_token を検証します。
resource
パラメーターから、認可サーバーは要求に適用すべき
適切なポリシーを決定でき、
<https://backend.example.com> での使用に適したトークンを発行します。
図3に示される応答の
access_token パラメーターには、新しいトークンが含まれます。このトークン
自体は 1 分間有効なベアラー OAuth
アクセストークンです。たまたまこのトークンは
JWT ですが、その構造と形式は
クライアントにとって不透明であるため、issued_token_type
は、それがアクセストークンであることだけを示します。¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQiOiJo
dHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2FzLmV
4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1MzMsIn
N1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQedw6rx
f59WlwHDD9jryFOr0_Wh3CGozQBihNBgnXEQgU85AI9x3KmsPottVMLPIWvmDCM
y5-kdXjwhw",
"issued_token_type":
"urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":60
}
その後、リソースサーバーは、新たに取得したアクセストークンを使用して、 図 4に示すようにバックエンドサーバーへ要求を行うことができます。¶
GET /api HTTP/1.1
Host: backend.example.com
Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ
iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2
FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M
zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe
dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBgnXEQgU85AI9x3KmsPottVMLPIW
vmDCMy5-kdXjwhw
この仕様のいくつかのパラメーターは、対象となるトークンを説明する値として
識別子を使用します。
具体的には、要求の
requested_token_type、
subject_token_type、actor_token_type
パラメーター、および応答の issued_token_type メンバーです。
トークンタイプ識別子は URI です。
トークン交換は、他の当事者によって発行されたトークンと、
指定された認可サーバーのトークンの両方を扱えます。前者の場合、トークンタイプ識別子は
認可サーバーが解析できるよう構文(たとえば JWT または SAML 2.0)を示し、
後者の場合は、
その認可サーバーが何のために発行したものか(たとえば access_token または
refresh_token)を示します。¶
次のトークンタイプ識別子をこの仕様で定義します。 他のトークンタイプを示すために、その他の URI を使用してもよいです。¶
第9節 of [JWT] で定義された値
urn:ietf:params:oauth:token-type:jwt は、トークンが JWT であることを示します。¶
アクセストークンと JWT の区別は微妙です。
アクセストークンは委任された認可判断を表しますが、JWT はトークン形式です。
アクセストークンは JWT 形式にできますが、必ずしもそうである必要はありません。また、
JWT がアクセストークンであることも十分あり得ますが、すべての JWT がアクセストークンというわけではありません。
この仕様の意図は、urn:ietf:params:oauth:token-type:access_token が、
対象の認可サーバーによって発行され、クライアントには不透明であり、
その認可サーバーから取得した他のアクセストークンと同じ方法で使用できる、典型的な OAuth アクセストークンであることを
示すものとすることです。
(それが JWT である可能性は十分ありますが、クライアントはその事実を認識しておらず、認識する必要もありません。)
一方、urn:ietf:params:oauth:token-type:jwt は、JWT が明示的に
要求または送信されていることを示すためのものです(たとえば、[RFC7523]
によって可能になるような、JWT を認可
グラントとして使用し、別の認可サーバーから
アクセストークンを取得するクロスドメインのユースケースなど)。¶
バイナリ形式のトークンについては、それを伝送するために使用する URI が、 HTTP および OAuth での使用に適した base64 またはその他の エンコーディングのセマンティクスと関連付けられている必要があることに注意してください。¶
トークン内で委任を表現する仕組み、および委任または なりすましを行う認可を表現する仕組みが定義されていることは有用です。 ここで説明するトークン交換プロトコルは どの種類のトークンでも使用できますが、この節では、特に JWT および OAuth 2.0 Token Introspection [RFC7662] 応答でそのような セマンティクスを表現するクレームを定義します。他の種類のトークンについても同様の 定義は可能ですが、この仕様の範囲外です。¶
iss、sub、
exp など、ここでは定義されていないものの例や説明で使用されるクレームは、
[JWT] で定義されていることに注意してください。¶
act(アクター)クレームは、
JWT 内で委任が発生したことを表現し、権限を委任された
行為者を識別する手段を提供します。act クレームの値は JSON
オブジェクトであり、その JSON オブジェクトのメンバーはアクターを識別するクレームです。
act クレームを構成するクレームは、アクターを識別し、
場合によってはアクターに関する追加情報を提供します。たとえば、
iss と sub の2つのクレームの組み合わせが、
アクターを一意に識別するために必要となる場合があります。¶
ただし、act クレーム内のクレームはアクターのアイデンティティのみに関係し、
トップレベルのクレームと同じように、包含する JWT の有効性には関係しません。
したがって、アイデンティティ以外のクレーム(たとえば exp、nbf、
aud)は、
act クレーム内で使用しても意味がないため、使用しません。¶
図5は、JWT クレームセット内の
act(アクター)クレームを示しています。
トークン自体のクレームは user@example.com に関するものですが、act クレームは
admin@example.com が現在のアクターであることを示します。¶
{
"aud":"https://consumer.example.com",
"iss":"https://issuer.example.com",
"exp":1443904177,
"nbf":1443904077,
"sub":"user@example.com",
"act":
{
"sub":"admin@example.com"
}
}
ある act クレームを別のクレーム内にネストすることで、
委任チェーンを表現できます。最も外側の act クレームは現在のアクターを表し、
ネストされた act クレームは以前のアクターを表します。
最も古いアクターが最も深くネストされます。ネストされた act クレームは、
最初の要求とサブジェクトから、現在のアクターに到達するまでに行われた
さまざまな委任の段階をつなぐ履歴として機能します。
この意味で、現在のアクターは
認可/委任の履歴全体を含むものとみなされ、
ここで説明するネスト構造に自然につながります。¶
アクセス制御ポリシーを適用する目的では、トークンの利用者は、
トークンのトップレベルのクレームと、act
クレームによって現在のアクターとして識別される当事者のみを考慮しなければなりません。
ネストされた act クレームによって識別される以前のアクターは、
情報提供のみを目的としており、アクセス制御の判断で考慮してはなりません。¶
図6の次の例は、
JWT クレームセット内にネストされた
act(アクター)クレームを示しています。
トークン自体のクレームは user@example.com に関するものですが、act クレームは、
システム <https://service16.example.com> が現在のアクターであり、
<https://service77.example.com> が以前のアクターであったことを示します。
このようなトークンは、service16 が service77 からの呼び出しでトークンを受信し、
service26 を呼び出すのに適したトークンと交換した結果として生成され、
認可サーバーが新たに発行したトークン内に
その状況を記録する場合があります。¶
{
"aud":"https://service26.example.com",
"iss":"https://issuer.example.com",
"exp":1443904100,
"nbf":1443904000,
"sub":"user@example.com",
"act":
{
"sub":"https://service16.example.com",
"act":
{
"sub":"https://service77.example.com"
}
}
}
OAuth トークンイントロスペクション応答のトップレベルメンバーとして含まれる場合、
act は、
同名のクレームと同じセマンティクスおよび形式を持ちます。¶
scope クレームの値は、
第
3.3節 of [RFC6749] で説明されている形式で、
トークンに関連付けられたスコープを空白で区切ったリストを含む
JSON 文字列です。¶
図7は、
JWT クレームセット内の scope クレームを示します。¶
{
"aud":"https://consumer.example.com",
"iss":"https://issuer.example.com",
"exp":1443904177,
"nbf":1443904077,
"sub":"dgaf4mvfs75Fci_FL3heQA",
"scope":"email profile phone address"
}
OAuth 2.0 Token Introspection [RFC7662] はすでに、トークンに関連付けられたスコープを伝えるための
scope パラメーターを定義しています。¶
client_id クレームは、
トークンを要求した OAuth 2.0 [RFC6749] クライアントの
クライアント識別子を運びます。¶
図8の次の例は、JWT クレームセット内の
client_id クレームを示し、
識別子が "s6BhdRkqt3" である OAuth 2.0 クライアントを表しています。¶
{
"aud":"https://consumer.example.com",
"iss":"https://issuer.example.com",
"exp":1443904177,
"sub":"user@example.com",
"client_id":"s6BhdRkqt3"
}
OAuth 2.0 Token Introspection [RFC7662] はすでに、
トークンを要求した OAuth 2.0 クライアントのクライアント識別子として
client_id パラメーターを定義しています。¶
may_act クレームは、ある当事者がアクターとなり、
別の当事者に代わって行動することを認可されていることを表明します。
このクレームは、たとえば subject_token が
トークン交換要求でトークンエンドポイントに提示されたときに使用でき、
サブジェクトトークン内の may_act クレームを認可
サーバーが使用して、クライアント(または
actor_token で識別される当事者)が、要求された委任または
なりすましを行うことを認可されているかどうかを判断できます。
クレーム値は JSON オブジェクトであり、その JSON オブジェクトのメンバーは、
クレームを含む JWT によって識別される当事者のために行動する資格があると
表明された当事者を識別するクレームです。
may_act
クレームを構成するクレームは、認可されたアクターを識別し、
場合によっては追加情報を提供します。
たとえば、iss
と sub の2つのクレームの組み合わせが、認可されたアクターを一意に識別するために必要な場合があり、
email クレームは、その当事者に関する追加の有用な情報を提供するために使用できます。¶
ただし、may_act クレーム内のクレームは、その当事者のアイデンティティのみに関係し、
トップレベルのクレームと同じように、包含する JWT の有効性には関係しません。
したがって、exp、nbf、aud
などのクレームは、may_act クレーム内で使用しても意味がないため、
使用しません。¶
図9は、
JWT クレームセット内の may_act クレームを示します。
トークン自体のクレームは user@example.com に関するものですが、may_act クレームは、
admin@example.com が user@example.com に代わって行動することを認可されていることを示します。¶
{
"aud":"https://consumer.example.com",
"iss":"https://issuer.example.com",
"exp":1443904177,
"nbf":1443904077,
"sub":"user@example.com",
"may_act":
{
"sub":"admin@example.com"
}
}
OAuth トークンイントロスペクション応答のトップレベルメンバーとして含まれる場合、
may_act は
同名のクレームと同じセマンティクスおよび形式を持ちます。¶
The OAuth 2.0 Authorization Framework のセキュリティに関する考慮事項である 第10節 of [RFC6749] の指針の多くは、ここにも適用されます。 さらに、[RFC6819] は OAuth に関する追加のセキュリティ上の考慮事項を提供し、 [OAUTH-SECURITY] は、OAuth 2.0 が最初に公開されて以降の配備経験と新たに出現した脅威に基づいて、 セキュリティ指針を更新しています。¶
[JWT] で説明される通常のセキュリティ上の問題、 特に URI の比較や認識されない値の扱いに関するものも、 ここに適用されます。¶
さらに、委任となりすましはどちらも固有の
セキュリティ上の問題をもたらします。あるプリンシパルの権利が
別のプリンシパルに委任される場合は常に、悪用の可能性が懸念されます。
このような悪用の可能性を軽減するため、
scope クレームを使用すること(トークンの有効期間を制限するなど、
その他の一般的な制約に加えて)が推奨されます。これは、
委任された権利を行使できる文脈を制限するためです。¶
ここで説明する機能の文脈で使用されるトークンには、 プライバシー上機微な情報が含まれる場合があります。そのような情報が 意図しない当事者に開示されることを防ぐため、Transport Layer Security (TLS) などの暗号化されたチャネルを通じてのみ送信しなければなりません。 特定の情報がクライアントに開示されることを防ぐことが望ましい場合、 トークンは意図された受信者向けに暗号化しなければなりません。 配備では、必要最小限の データ量を決定し、そのような情報のみを発行されるトークンに含めるべきです。 場合によっては、データ最小化として、 匿名または仮名のユーザーのみを表現することがあります。¶
IANA は、"OAuth Parameters" レジストリの "OAuth URI" サブレジストリ [IANA.OAuth.Parameters] に、 次の値を登録しました。"OAuth URI" サブレジストリは [RFC6755] によって 確立されました。¶
IANA は、"OAuth Parameters" レジストリの "OAuth Parameters" サブレジストリ [IANA.OAuth.Parameters] に 次の値を登録しました。"OAuth Parameters" サブレジストリは [RFC6749] によって 確立されました。¶
IANA は、"OAuth Parameters" レジストリの "OAuth Access Token Types" サブレジストリ [IANA.OAuth.Parameters] に、 次のアクセストークンタイプを登録しました。 "OAuth Access Token Types" サブレジストリは [RFC6749] によって 確立されました。¶
IANA は、"JSON Web Token (JWT)" レジストリの "JSON Web Token Claims" サブレジストリ [IANA.JWT] に、 次のクレームを登録しました。"JSON Web Token Claims" サブレジストリは [JWT] によって 確立されました。¶
IANA は、"OAuth Parameters" レジストリの "OAuth Token Introspection Response" レジストリ [IANA.OAuth.Parameters] に 次の値を登録しました。 "OAuth Token Introspection Response" レジストリは [RFC7662] によって 確立されました。¶
次の各節では、なりすましと委任をそれぞれ示す 2つのトークン交換例を示します (余分な改行とインデントは表示目的のみです)。¶
次のトークン交換要求では、クライアントは
なりすましのセマンティクスを持つトークンを要求しています(subject_token
のみで actor_token がない場合、委任は不可能です)。
クライアントは認可サーバーに、
論理名 urn:example:cooperation-context を持つ
対象サービスで使用するトークンが必要であることを伝えます。¶
POST /as/token.oauth2 HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange &audience=urn%3Aexample%3Acooperation-context &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTA2MDAsIm5iZiI6MTQ0MTkwOTAwMCwic 3ViIjoiYmRjQGV4YW1wbGUubmV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN 0b3J5In0.PRBg-jXn4cJuj1gmYXFiGkZzRuzbXZ_sDxdE98ddW44ufsbWLKd3JJ1VZ hF64pbTtfjy4VXFVBDaQpKjn5JzAw &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
前の要求の subject_token は JWT であり、
デコードされた JWT クレームセットをここに示します。この JWT は、
特定の時間範囲内に認可サーバーによって処理されることを意図しています。
JWT のサブジェクト(bdc@example.net)は、
新しいトークンが代わりに要求される当事者です。¶
{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910600,
"nbf":1441909000,
"sub":"bdc@example.net",
"scope":"orders profile history"
}
下に示すトークン交換応答の access_token パラメーターには、
クライアントが要求した新しいトークンが含まれています。
応答のその他のパラメーターは、そのトークンが
1時間で期限切れになるベアラーアクセストークンであることを示しています。¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic3ViIjoiYmRjQGV4YW1wbGUub
mV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN0b3J5In0.rMdWpSGNACTvnF
uOL74sYZ6MVuld2Z2WkGLmQeR9ztj6w2OXraQlkJmGjyiCq24kcB7AI2VqVxl3wSW
nVKh85A",
"issued_token_type":
"urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":3600
}
発行されたトークンのデコード済み JWT クレームセットを下に示します。新しい JWT は
認可サーバーによって発行され、
論理名 urn:example:cooperation-context で知られるシステムエンティティによって、
有効期限より前の任意の時点で処理されることを意図しています。
JWT のサブジェクト(sub)は、
要求に使用されたトークンのサブジェクトと同じであり、
これによりクライアントは、トークンを使用することで、
論理名 urn:example:cooperation-context で知られる
システムエンティティに対して、そのサブジェクトになりすますことが実質的に可能になります。¶
{
"aud":"urn:example:cooperation-context",
"iss":"https://as.example.com",
"exp":1441913610,
"sub":"bdc@example.net",
"scope":"orders profile history"
}
次のトークン交換要求では、クライアントはトークンを要求し、
subject_token と actor_token の両方を提供しています。
クライアントは認可サーバーに、
論理名 urn:example:cooperation-context を持つ
対象サービスで使用するトークンが必要であることを伝えます。認可
サーバーのポリシーにより、発行されるトークンは複合トークンとなります。¶
POST /as/token.oauth2 HTTP/1.1 Host: as.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange &audience=urn%3Aexample%3Acooperation-context &subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInNjb3BlIjoic3RhdHVzIGZlZ WQiLCJzdWIiOiJ1c2VyQGV4YW1wbGUubmV0IiwibWF5X2FjdCI6eyJzdWIiOiJhZG1 pbkBleGFtcGxlLm5ldCJ9fQ.4rPRSWihQbpMIgAmAoqaJojAxj-p2X8_fAtAGTXrvM xU-eEZHnXqY0_AOZgLdxw5DyLzua8H_I10MCcckF-Q_g &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt &actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwczo vL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXIuZ XhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInN1YiI6ImFkbWluQGV4YW1wbGU ubmV0In0.7YQ-3zPfhUvzje5oqw8COCvN5uP6NsKik9CVV6cAOf4QKgM-tKfiOwcgZ oUuDL2tEs6tqPlcBlMjiSzEjm3yBg &actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
前の要求の subject_token は JWT であり、
デコードされた JWT クレームセットをここに示します。この JWT は、
特定の有効期限より前に
認可サーバーによって処理されることを意図しています。
JWT のサブジェクト
(user@example.net)は、
新しいトークンが代わりに要求される当事者です。¶
{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910060,
"scope":"status feed",
"sub":"user@example.net",
"may_act":
{
"sub":"admin@example.net"
}
}
前の要求の actor_token は JWT であり、
デコードされた JWT クレームセットをここに示します。この JWT も、
特定の有効期限より前に
認可サーバーによって処理されることを意図しています。
JWT のサブジェクト
(admin@example.net)は、
要求されているセキュリティトークンを行使するアクターです。¶
{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910060,
"sub":"admin@example.net"
}
下に示すトークン交換応答の access_token パラメーターには、
クライアントが要求した新しいトークンが含まれています。
応答のその他のパラメーターは、そのトークンが
1時間で期限切れになる JWT であり、発行されたトークンがアクセストークンではないため、
アクセストークンタイプが適用されないことを示しています。¶
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ
CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX
hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG
9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw",
"issued_token_type":"urn:ietf:params:oauth:token-type:jwt",
"token_type":"N_A",
"expires_in":3600
}
発行されたトークンのデコード済み JWT クレームセットを下に示します。新しい JWT は
認可サーバーによって発行され、
論理名
urn:example:cooperation-context
で知られるシステムエンティティによって、有効期限より前の任意の時点で処理されることを意図しています。
JWT のサブジェクト(sub)は、
要求に使用された subject_token の
サブジェクトと同じです。
JWT のアクター(act)は、
要求に使用された actor_token のサブジェクトと同じです。
これは委任を示し、
admin@example.net を、user@example.net に代わって行動する権限を
委任された現在のアクターとして識別します。¶
{
"aud":"urn:example:cooperation-context",
"iss":"https://as.example.com",
"exp":1441913610,
"scope":"status feed",
"sub":"user@example.net",
"act":
{
"sub":"admin@example.net"
}
}
この仕様は、数十名の活発かつ献身的な参加者を含む OAuth Working Group 内で開発されました。 Hannes Tschofenig、Derek Atkins、 Rifaat Shekh-Yusef の議長の下で作成され、 Kathleen Moriarty、Stephen Farrell、Eric Rescorla、Roman Danyliw、Benjamin Kaduk が Security Area Directors を務めました。¶
次の方々が、この仕様にアイデア、フィードバック、および文言を 提供しました: Caleb Baker, Vittorio Bertocci, Mike Brown, Thomas Broyer, Roman Danyliw, William Denniss, Vladimir Dzhuvinov, Eric Fazendin, Phil Hunt, Benjamin Kaduk, Jason Keglovitz, Torsten Lodderstedt, Barry Leiba, Adam Lewis, James Manger, Nov Matake, Matt Miller, Hilarie Orman, Matthew Perry, Eric Rescorla, Justin Richer, Adam Roach, Rifaat Shekh-Yusef, Scott Tomilson, および Hannes Tschofenig。¶