RFC 8693 OAuth 2.0 トークン交換 2020年1月
Jones, et al. 標準化過程 [ページ]
ストリーム:
インターネット技術タスクフォース (IETF)
RFC:
8693
分類:
標準化過程
公開:
ISSN:
2070-1721
著者:
M. Jones
Microsoft
A. Nadalin
Microsoft
B. Campbell,
Ping Identity
J. Bradley
Yubico
C. Mortimore
Visa

RFC 8693

OAuth 2.0 トークン交換

概要

本仕様は、OAuth 2.0 認可サーバーからセキュリティトークンを要求し取得する方法を定義することにより、 HTTP および JSON ベースの Security Token Service (STS) のためのプロトコルを定義する。 これには、なりすましおよび委任を用いるセキュリティトークンも含まれる。

このメモの位置付け

これはインターネット標準化過程の文書である。

本文書は Internet Engineering Task Force (IETF) の成果物である。これは IETF コミュニティの合意を表すものである。本文書は 公開レビューを受けており、Internet Engineering Steering Group (IESG) によって 公開が承認されている。インターネット標準に関する詳細情報は、 RFC 7841 のセクション 2 で入手できる。

本文書の現在の状態、正誤表、およびフィードバックの提供方法に関する情報は、 https://www.rfc-editor.org/info/rfc8693 で入手できる。

目次

1. 導入

セキュリティトークンは、異種環境またはセキュリティドメインをまたいで アイデンティティおよびセキュリティ情報の共有を容易にする情報の集合である。 セキュリティトークンの例には、JSON Web Tokens (JWTs) [JWT] および Security Assertion Markup Language (SAML) 2.0 アサーション [OASIS.saml-core-2.0-os] が含まれる。 セキュリティトークンは、 通常、完全性を達成するために署名され、ときには 機密性を達成するために暗号化もされる。セキュリティトークンは、[RFC7521] のように アサーションとも呼ばれることがある。

Security Token Service (STS) は、提供された セキュリティトークンを検証し、それに応答して新しいセキュリティトークンを発行できる サービスであり、これによりクライアントは、異種環境またはセキュリティ ドメインをまたいだリソースに対する適切な アクセス資格情報を取得できる。 Web Service クライアントは、トークン交換のために 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 の相互作用では、リソース所有者認可の何らかの 表現をアクセストークンと交換するが、 これは実際に非常に有用なパターンであることが証明されている。しかし、 その入力と出力は、そのままではセキュリティトークン交換フレームワークを完全に 収容するにはやや制約が強すぎる。

本仕様は、STS の役割を担う認可サーバーから クライアントがセキュリティトークンを要求し取得できるようにする、 OAuth 2.0 を拡張するプロトコルを定義する。 OAuth 2.0 と同様に、本仕様はクライアント開発者にとっての単純さに重点を置き、 現代の開発環境でほぼ普遍的に利用可能な HTTP クライアントと JSON パーサーのみを必要とする。本仕様で定義される STS プロトコルは、 それ自体は RESTful ではない (STS は REST アプローチに特に適しているわけではない) が、RESTful システムでの作業に慣れた 開発者にとって馴染みのあるはずの通信パターンおよびデータ形式を利用する。

トークン交換リクエストの新しいグラントタイプ、および トークンエンドポイントに対するそのようなリクエストに関連する具体的なパラメーターは、 本仕様によって定義される。 トークン交換レスポンスは、トークンエンドポイントからの通常の OAuth 2.0 レスポンスであり、 クライアントへ情報を提供するために本仕様で定義される追加パラメーターをいくつか含む。

トークン交換のリクエストを行うエンティティは、トークン交換相互作用の文脈において クライアントと見なされる。ただし、これは このプロファイルの使用を従来の OAuth クライアントに限定するものではない。たとえば OAuth リソースサーバーは、 保護リソースリクエストで受け取った アクセストークンを、バックエンドサービスへの呼び出しに含めるのに適した 新しいトークンと交換するために、トークン交換中に クライアントの役割を担うことがある。この新しいトークンは、下流サービス向けに より狭いスコープを持つアクセストークンである場合もあれば、まったく異なる種類 のトークンである場合もある。

本仕様の範囲は、OAuth 2.0 を利用する STS スタイルのトークン交換のための基本的なリクエストおよびレスポンスプロトコルの 定義に限定される。 委任セマンティクスを表現できるようにする新しい JWT クレームがいくつか定義されているが、 トークン自体の具体的な構文、セマンティクス、およびセキュリティ特性 (認可サーバーに提示されるものとクライアントが取得するものの両方) は明示的に範囲外であり、実装が展開される可能性のある 信頼モデルには要件を課さない。追加プロファイルは、 トークンの署名および/または暗号化が必要か、または proof-of-possession スタイルの トークンが要求または発行されるかなど、関係する当事者および信頼の具体的な性質に関する より詳細な要件を提供することができる。しかし、そのような詳細は、 個々の展開の具体的なニーズに関して行われるポリシー上の決定であることが多く、 それに応じて構成または実装される。

取得されたセキュリティトークンは多くの文脈で使用できるが、 その具体的内容も本仕様の範囲外である。

1.1. 委任と なりすましのセマンティクス

STS の一般的なユースケースの 1 つ (前のセクションで示唆したように) は、 リソースサーバー A が、要求ユーザー B の 代理としてバックエンドサービス C を呼び出せるようにすることである。ローカルサイトポリシーおよび 認可インフラストラクチャに応じて、A が B の代理として 動作していることを何らかの形で示す注釈とともに、自身の 資格情報を用いて C にアクセスすること ("委任")、または A に C への限定されたアクセス 資格情報を付与するが、それが引き続き B を認可された エンティティとして識別すること ("なりすまし") が望ましい場合がある。委任と なりすましは、複数の参加者が関わる他のシナリオでも有用な 概念となり得る。

プリンシパル A がプリンシパル B になりすます場合、A は 定義された権利コンテキストの範囲内で B が持つすべての 権利を与えられ、そのコンテキストでは B と区別できない。 したがって、プリンシパル A がプリンシパル B になりすます場合、 そのようなトークンを受け取るエンティティに関する限り、 それらは実際には B とやり取りしていることになる。 アイデンティティシステムの一部の構成員が、なりすましが 行われていることを認識している可能性はあるが、それは要件ではない。 あらゆる意図と目的において、A が B になりすましている場合、A は トークンによって認可された権利のコンテキスト内では B である。A が B になりすます能力は、 トークンの内容または帯域外メカニズムによって、 スコープまたは時間、さらには 1 回限りの使用制限に限定されることがある。

委任セマンティクスは、 なりすましセマンティクスとは異なるが、両者は密接に関連している。 委任セマンティクスでは、プリンシパル A は B とは別個の自身のアイデンティティを 引き続き持ち、B がその権利の一部を A に委任した可能性はあるものの、 行われるあらゆるアクションは、B を代表する A によって 行われていることが明示的に理解される。ある意味で、A は B のエージェントである。

委任となりすましは、すべての状況を包含するものではない。 たとえば、プリンシパルが直接自身の代理として動作している場合、 委任もなりすましも関係していない。しかし、それらは トークン交換で動作するより一般的なセマンティクスであり、そのため 本仕様ではより直接的に扱われる。

委任セマンティクスは通常、トークンの主たる主体と、その主体が権利の一部を委任した アクターの両方に関する情報を含めることによって、トークン内で表現される。 このようなトークンは、複数の主体に関する情報で構成されるため、 複合トークンと呼ばれることがある。通常、リクエストでは、subject_token はトークンが要求される相手方の 代理となる当事者のアイデンティティを表し、actor_token は 発行されるトークンのアクセス権が委任される当事者の アイデンティティを表す。 認可サーバーによって発行される複合トークンは、両当事者に関する情報を 含む。 複合トークンが発行されるかどうか、およびいつ発行されるかは、認可サーバーならびに 適用されるポリシーおよび構成の裁量に委ねられる。

複合トークンを表現する具体的な方法、さらには そのようなトークンが発行されるかどうかは、実装の詳細と トークンの種類に依存する。JWT ではない複合トークンの表現は、 本仕様の範囲外である。ただし、actor_token リクエスト パラメーターは、望まれるアクターに関する情報を提供する 手段を提供し、JWT の act クレームは委任の連鎖の表現を提供できる。

1.2. 要件表記 および規約

本文書におけるキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", および "OPTIONAL" は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されるとおりに解釈される。

1.3. 用語

本仕様は、OAuth 2.0 [RFC6749] で定義される "access token type", "authorization server", "client", "client identifier", "resource server", "token endpoint", "token request", および "token response" という用語、ならびに JSON Web Token (JWT) [JWT] で定義される "Base64url Encoding", "Claim", および "JWT Claims Set" という用語を使用する。

2. トークン交換リクエストおよびレスポンス

2.1. リクエスト

クライアントは、[RFC6749] の セクション 4.5 で定義される拡張グラントタイプメカニズムを用いて、 認可サーバーのトークンエンドポイントへトークンリクエストを行うことにより、 セキュリティトークンを要求する。

認可サーバーに対するクライアント認証は、OAuth 2.0 によって提供される通常の メカニズムを用いて行われる。 [RFC6749] の セクション 2.3.1 はクライアントのパスワードベース認証を定義しているが、 クライアント認証は拡張可能であり、他のメカニズムも可能である。 たとえば、[RFC7523] は bearer JSON Web Tokens (JWTs) [JWT] を用いたクライアント 認証を定義している。 サポートされるクライアント認証方法、および 認証されていない、または識別されていないクライアントを許可するかどうかは、 認可サーバーの裁量による展開上の決定である。 クライアント認証を省略すると、侵害されたトークンを所有する 誰でも、そのトークンを STS 経由で他のトークンへ 活用できることに注意されたい。したがって、クライアント 認証により、他のエンティティになりすます、または他の エンティティから委任を受けることが許可されるエンティティに関して、 STS による追加の認可チェックが可能となる。

クライアントは、HTTP POST メソッドを使用し、拡張 グラントタイプを伴ってトークンエンドポイントへトークン交換リクエストを行う。 以下のパラメーターは、[RFC6749] の付録 B に記述されるとおり、UTF-8 の文字エンコーディングを用いた application/x-www-form-urlencoded 形式で HTTP リクエスト entity-body に含められる。

grant_type
REQUIRED. 値 urn:ietf:params:oauth:grant-type:token-exchange は、トークン交換が実行されていることを示す。
resource
OPTIONAL. クライアントが要求されたセキュリティトークンを使用しようとする 対象サービスまたはリソースを示す URI。これにより、認可サーバーは、 発行されるトークンの種別と内容を決定したり、トークンを暗号化するかどうか、および どのように暗号化するかを決定したりするなど、 対象に応じて適切なポリシーを適用できる。 多くの場合、クライアントは相互作用するシステムの論理的構成を 知らず、 トークンを使用しようとするサービスの URI だけを知っている。 resource パラメーターにより、クライアントは、 発行されたトークンを使用しようとする場所を認可 サーバーに示すことができる。これは通常、https URL として、トークン交換リクエスト内でそのリソースにアクセスする際に使用されるのと 同じ形式で場所を提供することによって行われる。 認可サーバーは通常、リソース URI 値から 適切なポリシーへマッピングする能力を持つ。resource パラメーターの値は、 [RFC3986] のセクション 4.3 で指定される 絶対 URI でなければならず (MUST)、 クエリコンポーネントを含んでもよい (MAY) が、 フラグメントコンポーネントを含んではならない (MUST NOT)。 発行されたトークンが列挙された複数のリソースで使用されることを示すために、 複数の resource パラメーターを使用できる。 resource パラメーターの追加の背景および使用法については [OAUTH-RESOURCE] を参照されたい。
audience
OPTIONAL. クライアントが要求されたセキュリティトークンを 使用しようとする対象サービスの論理名。これは resource パラメーターと同様の目的を果たすが、クライアントが 対象サービスの論理名を提供する点が異なる。その名前の解釈には、 値がクライアントと認可サーバーの双方に理解されるものである必要がある。 OAuth クライアント識別子、SAML エンティティ識別子 [OASIS.saml-core-2.0-os]、および OpenID Connect Issuer Identifier [OpenID.Core] は、 audience パラメーター値として使用され得るものの例である。 ただし、特定の認可サーバーで使用される audience 値は、 意図された値の種別として適切に解釈されることを保証するために、 そのサーバー内で一意でなければならない。発行されたトークンが 列挙された複数の audience で使用されることを示すために、 複数の audience パラメーターを使用できる。 audience および resource パラメーターは、 論理名とリソース URI が混在する複数の対象サービスを示すために 併用できる。
scope
OPTIONAL. [RFC6749] のセクション 3.3 で定義される、スペース区切りで大文字小文字を区別する 文字列のリストであり、クライアントが、トークンが使用される サービスまたはリソースの文脈において、要求するセキュリティトークンの 望ましいスコープを指定できるようにする。スコープの値と関連するセマンティクスは サービス固有であり、関連するサービスドキュメントに記述されることが期待される。
requested_token_type
OPTIONAL. セクション 3 に記述される、 要求されたセキュリティトークンの種別の識別子。 要求される種別が指定されていない場合、発行されるトークン種別は 認可サーバーの裁量によるものであり、 resource または audience パラメーターによって示される サービスまたはリソースの要件に関する知識によって 決定されることがある。
subject_token
REQUIRED. リクエストが行われる相手方の代理となる 当事者のアイデンティティを表すセキュリティトークン。 通常、このトークンの subject は、リクエストへの応答として 発行されるセキュリティトークンの subject となる。
subject_token_type
REQUIRED. セクション 3 に記述される識別子であり、 subject_token パラメーター内のセキュリティトークンの種別を 示す。
actor_token
OPTIONAL. 動作する当事者のアイデンティティを表す セキュリティトークン。通常、これは要求されたセキュリティトークンを 使用し、subject の代理として動作することを認可された当事者である。
actor_token_type
セクション 3 に記述される識別子であり、 actor_token パラメーター内のセキュリティトークンの種別を 示す。 これは、リクエストに actor_token パラメーターが存在する場合に REQUIRED であるが、それ以外の場合は含めてはならない (MUST NOT)。

リクエストの処理において、認可サーバーは、示されたトークン 種別に対して適切な検証手続きを実行しなければならず (MUST)、 actor token が存在する場合には、その示されたトークン種別に対しても 適切な検証手続きを実行しなければならない。 特定のトークンの有効性基準および詳細は、本文書の範囲外であり、 それぞれのトークン種別およびその内容に固有である。

1 回限りの使用またはトークン種別に固有のその他のセマンティクスがない場合、 トークン交換を実行する行為は、subject token または actor token の有効性に影響を与えない。 さらに、交換は 1 回限りのイベントであり、入力トークンと出力トークンの間に 密接なリンクを作成しない。そのため、たとえば出力トークンの有効期限が 入力トークンの有効期限の影響を受けることはあっても、 入力トークンの更新または延長が出力トークンのプロパティに反映されることは 期待されない。トークン失効イベントを伝播することが適切または望ましい場合は 依然としてあり得る。しかし、それは STS プロトコルの一般的な性質ではなく、 特定の実装、トークン種別、または展開に固有のものとなる。

2.1.1. Resource、Audience、Scope の関係

トークンを要求する際、クライアントは audience および resource パラメーターによって、そのトークンを使用しようとする 望ましい対象サービスを示すことができ、また scope パラメーターを用いて要求するトークンの望ましいスコープを示すことができる。 このようなリクエストのセマンティクスは、クライアントが、要求されたすべての対象サービスで使用可能な 要求スコープを持つトークンを求めているということである。実質的に、 トークンの要求されたアクセス権は、すべての対象サービスにおけるすべてのスコープの デカルト積である。

認可サーバーは、任意のトークンリクエストを満たすことを望まない、または 満たせない場合があるが、非常に広範なアクセス権が求められている場合には、 満たせないリクエストとなる可能性が大幅に高くなる。 そのため、展開におけるシステム間の関係に関する具体的な知識がない場合、 クライアントは要求するアクセスの広さ、特に 対象サービスの数に慎重であるべきである。認可サーバーは、 クライアントが同時に過度に多くの対象サービスへのアクセスを要求したことを通知するために、 セクション 2.2.2 で定義される invalid_target エラーコードを使用できる。

2.2. レスポンス

認可サーバーは、[RFC6749] のセクション 5 で指定されるとおり、トークンエンドポイントからの通常の OAuth 2.0 レスポンスでトークン交換リクエストに応答する。追加の詳細および 説明は、以下のサブセクションで提供される。

2.2.1. 成功 レスポンス

リクエストが有効で、認可サーバーのすべてのポリシーおよびその他の基準を満たす場合、 成功トークンレスポンスは、以下のパラメーターを "application/json" メディアタイプを用いて HTTP レスポンスの entity-body に追加し、 [RFC8259] で指定されるとおり、 HTTP 200 ステータスコードとともに構築される。 パラメーターは、各パラメーターをトップレベルに追加することにより、 JavaScript Object Notation (JSON) 構造へシリアライズされる。 パラメーター名および文字列値は JSON 文字列として含められる。 数値は JSON 数値として含められる。 パラメーターの順序は重要ではなく、変化してもよい。

access_token
REQUIRED. トークン交換リクエストへの応答として 認可サーバーによって発行されたセキュリティトークン。 [RFC6749] のセクション 5.1access_token パラメーターは、要求された トークンを運ぶためにここで使用される。これにより、このトークン交換プロトコルは、 トークンエンドポイント向けに定義された既存の OAuth 2.0 リクエスト およびレスポンス構成を使用できる。 access_token という識別子は歴史的理由で使用されており、 発行されたトークンは OAuth アクセストークンである必要はない。
issued_token_type
REQUIRED. セクション 3 に記述される、 発行されたセキュリティトークンの表現の識別子。
token_type
REQUIRED. [RFC6749] のセクション 7.1 で指定される、発行された アクセストークンを使用する方法を指定する、大文字小文字を区別しない値。 これは、保護リソースにアクセスするためにアクセストークンを どのように利用するかに関する情報をクライアントに提供する。たとえば、 [RFC6750] で指定される Bearer の値は、発行されたセキュリティトークンが bearer トークンであり、 クライアントがトークン自体の内容を超える追加の適格性証明なしに、 それをそのまま提示できることを示す。この パラメーターの意味は issued_token_type パラメーターの意味とは異なることに注意されたい。後者は 発行されたセキュリティトークンの表現を宣言するものである。"token type" という語は、 本仕様のすべての *_token_type パラメーターにおけるように、 セキュリティトークンの構造的または構文的表現を意味するために より一般的に使用される。 発行されたトークンがアクセストークンでない、またはアクセストークンとして使用できない場合、 token_typeN_A は、そのコンテキストに OAuth 2.0 token_type 識別子が適用できないことを示すために使用される。
expires_in
RECOMMENDED. 認可サーバーによって発行された トークンの有効期間を秒単位で表す。多くの場合、クライアントは トークンの内容を調べる意欲または能力を持たず、このパラメーターは、 トークンがどの程度の期間有効であると期待できるかについて、 一貫した、トークン種別に依存しない 指示を提供する。 たとえば、値 1800 は、レスポンスが生成された時点から 30 分後にトークンが期限切れになることを示す。
scope
発行されたセキュリティトークンのスコープがクライアントによって要求されたスコープと 同一である場合は OPTIONAL であり、 それ以外の場合は REQUIRED である。
refresh_token
OPTIONAL. 交換が一時的な資格情報 (subject_token) から、別の文脈で使用するための 異なる一時的な資格情報 (発行されたトークン) への交換である場合、 refresh token は通常発行されない。 refresh token は、トークン交換のクライアントが、元の資格情報が もはや有効でない場合でもリソースにアクセスする能力を必要とする場合 (例: クライアントとのアクティブセッションを維持しているユーザーがもはや存在しない、 user-not-present または offline シナリオ) に発行され得る。 本仕様のプロファイルまたは展開は、 urn:ietf:params:oauth:grant-type:token-exchange グラントタイプリクエストに応答してクライアントが refresh token を期待すべき条件を 明確に文書化するべきである。

2.2.2. エラーレスポンス

リクエスト自体が有効でない場合、または subject_token または actor_token のいずれかが何らかの理由で無効であるか、 ポリシーに基づいて受け入れ不能である場合、認可サーバーは、 [RFC6749] のセクション 5.2 で指定されるエラーレスポンスを 構築しなければならない (MUST)。 error パラメーターの値は、 invalid_request エラーコードでなければならない (MUST)。

認可サーバーが、resource または audience パラメーターで 示された任意の対象サービスに対してトークンを発行する意思がない、または発行できない場合、 エラーレスポンスでは invalid_target エラーコードを使用するべきである (SHOULD)。

認可 サーバーは、[RFC6749] のセクション 5.2 で説明されるように、 error_description を使用して、エラーの理由に関する追加情報を 含めてもよい (MAY)。

他のエラーコードも、適切に使用してよい。

2.3. トークン交換の例

以下の例は、OAuth リソースサーバーが 交換中にクライアントの役割を担う仮想的なトークン交換を示す。 リソースサーバーは、保護リソースリクエストで受け取ったアクセストークンを、 バックエンドサービスを呼び出すために使用する新しい トークンと交換する (例における余分な改行およびインデントは表示目的のみである)。

図 1 は、[RFC6750] のセクション 2.1 で指定されるとおり、 Authorization ヘッダーに OAuth アクセストークンを含む保護リソースリクエストを リソースサーバーが受け取る様子を示す。

 GET /resource HTTP/1.1
 Host: frontend.example.com
 Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC
図 1: 保護リソース リクエスト

図 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
図 2: トークン交換リクエスト

認可サーバーは、トークン交換リクエストで提示された クライアント資格情報および subject_token を検証する。 resource パラメーターから、認可サーバーは リクエストに適用すべき適切なポリシーを判定でき、 <https://backend.example.com> での使用に適したトークンを発行する。 図 3 に示すレスポンスの access_token パラメーターは新しいトークンを含み、 それ自体は 1 分間有効な bearer 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_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIWvmDCM
    y5-kdXjwhw",
  "issued_token_type":
      "urn:ietf:params:oauth:token-type:access_token",
  "token_type":"Bearer",
  "expires_in":60
 }
図 3: トークン交換レスポンス

リソースサーバーは、図 4 に示すように、新たに取得したアクセストークンを用いて バックエンドサーバーへリクエストを行うことができる。

 GET /api HTTP/1.1
 Host: backend.example.com
 Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ
    iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2
    FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M
    zMsInN1YiI6ImJkY0BleGFtcGxlLmNvbSIsInNjb3BlIjoiYXBpIn0.40y3ZgQe
    dw6rxf59WlwHDD9jryFOr0_Wh3CGozQBihNBhnXEQgU85AI9x3KmsPottVMLPIW
    vmDCMy5-kdXjwhw
図 4: バックエンド保護リソース リクエスト

追加の例は 付録 A にある。

3. トークン種別識別子

本仕様のいくつかのパラメーターは、対象となるトークンを 記述するための値として識別子を利用する。 具体的には、それらはリクエストの requested_token_type, subject_token_type, および actor_token_type パラメーター、ならびにレスポンスの issued_token_type メンバーである。 トークン種別識別子は URI である。 トークン交換は、他の当事者によって発行されたトークンと、 指定された認可サーバーからのトークンの両方で機能できる。前者の場合、トークン種別識別子は 構文 (例: JWT または SAML 2.0) を示し、認可サーバーがそれを解析できるようにする。後者の場合、 それは、 指定された認可サーバーが何のためにそれを発行したか (例: access_token または refresh_token) を示す。

以下のトークン種別識別子は本仕様によって定義される。 他のトークン種別を示すために、他の URI を使用してもよい (MAY)。

urn:ietf:params:oauth:token-type:access_token
トークンが指定された認可サーバーによって発行された OAuth 2.0 アクセストークンであることを示す。
urn:ietf:params:oauth:token-type:refresh_token
トークンが指定された認可サーバーによって発行された OAuth 2.0 refresh token であることを示す。
urn:ietf:params:oauth:token-type:id_token
トークンが [OpenID.Core] のセクション 2 で定義される ID Token であることを示す。
urn:ietf:params:oauth:token-type:saml1
トークンが base64url エンコードされた SAML 1.1 [OASIS.saml-core-1.1] アサーションであることを示す。
urn:ietf:params:oauth:token-type:saml2
トークンが base64url エンコードされた SAML 2.0 [OASIS.saml-core-2.0-os] アサーションであることを示す。

[JWT] のセクション 9 で定義される 値 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 またはその他の エンコーディングのセマンティクスと関連付けられている必要があることに注意されたい。

4. JSON Web Token クレームおよびイントロスペクションレスポンスパラメーター

トークン内で委任を表現するため、また 委任またはなりすましの認可を表現するための定義済みメカニズムを持つことは有用である。 ここで記述されるトークン交換プロトコルは 任意の種類のトークンとともに使用できるが、このセクションでは、 JWT および OAuth 2.0 Token Introspection [RFC7662] レスポンスにおいて、 そのようなセマンティクスを具体的に表現するためのクレームを定義する。 他の種類のトークンに対する同様の定義も可能であるが、本仕様の範囲外である。

ここで確立されていないが、例および説明で使用される iss, sub, exp などのクレームは、[JWT] によって定義されることに注意されたい。

4.1. "act" (Actor) クレーム

act (actor) クレームは、JWT 内で 委任が発生したことを表現し、権限が委任された 動作当事者を識別する手段を提供する。act クレーム値は JSON オブジェクトであり、JSON オブジェクト内のメンバーは actor を識別するクレームである。 act クレームを構成するクレームは、actor を識別し、場合によっては actor に関する追加情報を提供する。たとえば、 2 つのクレーム isssub の組み合わせが、 actor を一意に識別するために必要となることがある。

しかし、act クレーム内のクレームは actor のアイデンティティにのみ関係し、 トップレベルのクレームと同じ方法で、それを含む JWT の有効性には関係しない。 したがって、非アイデンティティクレーム (例: exp, nbf, および aud) は act クレーム内で使用されても意味がないため、使用されない。

図 5 は、JWT Claims Set 内の act (actor) クレームを示す。 トークン自体のクレームは user@example.com に関するものであり、act クレームは admin@example.com が現在の actor であることを示す。

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "nbf":1443904077,
   "sub":"user@example.com",
   "act":
   {
     "sub":"admin@example.com"
   }
 }
図 5: Actor クレーム

ある act クレームを別の act クレーム内に ネストすることにより、委任の連鎖を表現できる。最も外側の act クレームは現在の actor を表し、ネストされた act クレームは以前の actor を表す。最も古い actor は最も深く ネストされる。ネストされた act クレームは、 最初のリクエストおよび subject から、現在の actor に到達する前に行われた さまざまな委任ステップまでを接続する履歴の痕跡として機能する。 この意味で、現在の actor は、ここで記述するネスト構造へ自然につながる 全体の認可/委任履歴を含むものと見なされる。

アクセス制御ポリシーを適用する目的では、トークンの消費者は、 トークンのトップレベルクレームと、act クレームによって現在の actor として識別される当事者のみを考慮しなければならない (MUST)。ネストされた act クレームによって識別される以前の actor は 情報提供のみであり、アクセス制御決定で考慮されてはならない。

図 6 の以下の例は、JWT Claims Set 内のネストされた act (actor) クレームを示す。 トークン自体のクレームは user@example.com に関するものであり、act クレームは、 システム <https://service16.example.com> が現在の actor であり、 <https://service77.example.com> が以前の actor であったことを示す。 このようなトークンは、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"
     }
   }
 }
図 6: ネストされた Actor クレーム

OAuth トークンイントロスペクションレスポンスのトップレベルメンバーとして含まれる場合、 act は 同名のクレームと同じセマンティクスおよび形式を持つ。

4.2. "scope" (Scopes) クレーム

scope クレームの値は、 [RFC6749] のセクション 3.3 に記述される形式で、 トークンに関連付けられたスコープのスペース区切りリストを含む JSON 文字列である。

図 7 は、 JWT Claims Set 内の scope クレームを示す。

 {
   "aud":"https://consumer.example.com",
   "iss":"https://issuer.example.com",
   "exp":1443904177,
   "nbf":1443904077,
   "sub":"dgaf4mvfs75Fci_FL3heQA",
   "scope":"email profile phone address"
 }
図 7: Scopes クレーム

OAuth 2.0 Token Introspection [RFC7662] は、トークンに関連付けられたスコープを伝達するために scope パラメーターをすでに定義している。

4.3. "client_id" (Client Identifier) クレーム

client_id クレームは、 トークンを要求した OAuth 2.0 [RFC6749] クライアントの クライアント識別子を運ぶ。

図 8 の以下の例は、JWT Claims Set 内の 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"
 }
図 8: Client Identifier クレーム

OAuth 2.0 Token Introspection [RFC7662] は、トークンを要求した OAuth 2.0 クライアントの クライアント識別子として client_id パラメーターをすでに定義している。

4.4. "may_act" (Authorized Actor) クレーム

may_act クレームは、ある当事者が actor となり、 別の当事者の代理として動作することを認可されているという表明を行う。 このクレームは、たとえば、subject_token が トークン交換リクエストでトークンエンドポイントに提示され、subject token 内の may_act クレームを、クライアント (または actor_token で識別される当事者) が要求された委任または なりすましに関与することを認可されているかどうかを認可 サーバーが判定するために使用できる場合に用いられることがある。 クレーム値は JSON オブジェクトであり、JSON オブジェクト内のメンバーは、 クレームを含む JWT によって識別される当事者のために 行動する資格があると主張される当事者を識別するクレームである。 may_act クレームを構成するクレームは、認可された actor を識別し、場合によっては 追加情報を提供する。 たとえば、iss および sub の 2 つのクレームの組み合わせが、 認可された actor を一意に識別するために必要となることがあり、 一方で email クレームは、その当事者に関する追加の有用な情報を提供するために 使用されることがある。

しかし、may_act クレーム内のクレームはその当事者のアイデンティティにのみ関係し、 トップレベルクレームと同じ方法で、それを含む JWT の 有効性には関係しない。 したがって、exp, nbf, および aud のようなクレームは、may_act クレーム内で使用されても意味がないため、使用されない。

図 9 は、 JWT Claims Set 内の 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"
   }
 }
図 9: Authorized Actor クレーム

OAuth トークンイントロスペクションレスポンスのトップレベルメンバーとして含まれる場合、 may_act は同名のクレームと同じセマンティクスおよび形式を持つ。

5. セキュリティ上の考慮事項

[RFC6749] のセクション 10、 The OAuth 2.0 Authorization Framework の Security Considerations にあるガイダンスの多くは、 ここにも適用可能である。 さらに、[RFC6819] は OAuth に関する追加のセキュリティ上の考慮事項を提供し、 [OAUTH-SECURITY] は OAuth 2.0 が最初に公開されて以降に出現した展開経験および新しい脅威に基づいて、 セキュリティガイダンスを更新している。

[JWT] で議論される通常のセキュリティ上の問題すべて、 特に URI の比較および認識されない値の扱いに関するものも、 ここに適用される。

加えて、委任となりすましのいずれも固有の セキュリティ問題を導入する。あるプリンシパルの権利が 別のプリンシパルへ委任されるたびに、悪用の可能性が懸念となる。 そのような悪用の可能性を緩和するために、scope クレームの使用 (限定されたトークン有効期間などの他の典型的な制約に加えて) が示唆される。これは、委任された権利を行使できる文脈を制限するためである。

6. プライバシー上の考慮事項

ここで記述される機能の文脈で使用されるトークンは、 プライバシーに敏感な情報を含むことがあり、そのような情報が 意図しない当事者に開示されることを防ぐため、 Transport Layer Security (TLS) などの暗号化されたチャネル上でのみ送信されなければならない (MUST)。 クライアントへの特定の情報の開示を防ぐことが望ましい場合、 トークンはその意図された受信者に対して暗号化されなければならない (MUST)。 展開では、最小限必要なデータ量を決定し、そのような情報のみを発行トークンに 含めるべきである (SHOULD)。 場合によっては、データ最小化に、匿名または仮名のユーザーのみを 表現することが含まれる。

7. IANA に関する考慮事項

7.1. OAuth URI 登録

IANA は、"OAuth Parameters" レジストリ [IANA.OAuth.Parameters] の "OAuth URI" サブレジストリに以下の値を登録した。 "OAuth URI" サブレジストリは [RFC6755] によって確立された。

  • URN: urn:ietf:params:oauth:grant-type:token-exchange
  • 共通名: OAuth 2.0 用トークン交換グラントタイプ
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • URN: urn:ietf:params:oauth:token-type:access_token
  • 共通名: OAuth 2.0 アクセストークン用トークン種別 URI
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 3
  • URN: urn:ietf:params:oauth:token-type:refresh_token
  • 共通名: OAuth 2.0 refresh token 用トークン種別 URI
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 3
  • URN: urn:ietf:params:oauth:token-type:id_token
  • 共通名: ID Token 用トークン種別 URI
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 3
  • URN: urn:ietf:params:oauth:token-type:saml1
  • 共通名: base64url エンコードされた SAML 1.1 アサーション用トークン種別 URI
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 3
  • URN: urn:ietf:params:oauth:token-type:saml2
  • 共通名: base64url エンコードされた SAML 2.0 アサーション用トークン種別 URI
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 3

7.2. OAuth パラメーター 登録

IANA は、 "OAuth Parameters" レジストリ [IANA.OAuth.Parameters] の "OAuth Parameters" サブレジストリに以下の値を登録した。 "OAuth Parameters" サブレジストリは [RFC6749] によって確立された。

  • パラメーター名: audience
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: requested_token_type
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: subject_token
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: subject_token_type
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: actor_token
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: actor_token_type
  • パラメーター使用場所: token request
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.1
  • パラメーター名: issued_token_type
  • パラメーター使用場所: token response
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.2.1

7.3. OAuth アクセストークン 種別登録

IANA は、"OAuth Parameters" レジストリ [IANA.OAuth.Parameters] の "OAuth Access Token Types" サブレジストリに 以下のアクセストークン種別を登録した。 "OAuth Access Token Types" サブレジストリは [RFC6749] によって確立された。

  • 種別名: N_A
  • 追加のトークンエンドポイントレスポンスパラメーター: なし
  • HTTP 認証スキーム: なし
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 2.2.1

7.4. JSON Web Token クレーム 登録

IANA は、"JSON Web Token (JWT)" レジストリ [IANA.JWT] の "JSON Web Token Claims" サブレジストリに、以下の Claims を登録した。 "JSON Web Token Claims" サブレジストリは [JWT] によって確立された。

  • Claim Name: client_id
  • Claim Description: Client Identifier
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 4.3
  • Claim Name: may_act
  • Claim Description: Authorized Actor - actor となることを認可された当事者
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 4.4

7.5. OAuth トークン イントロスペクションレスポンス登録

IANA は、"OAuth Parameters" レジストリ [IANA.OAuth.Parameters] の "OAuth Token Introspection Response" レジストリに 以下の値を登録した。 "OAuth Token Introspection Response" レジストリは [RFC7662] によって確立された。

  • Name: may_act
  • Description: Authorized Actor - actor となることを認可された当事者
  • 変更管理者: IESG
  • 仕様文書: RFC 8693 の セクション 4.4

8. 参考文献

8.1. 規範的参考文献

[IANA.JWT]
IANA, "JSON Web Token (JWT)", <https://www.iana.org/assignments/jwt>.
[IANA.OAuth.Parameters]
IANA, "OAuth Parameters", <https://www.iana.org/assignments/oauth-parameters>.
[JWT]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/info/rfc7519>.
[RFC2119]
Bradner, S., "RFC において 要件レベルを示すために使用するキーワード", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): 汎用構文", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/info/rfc3986>.
[RFC6749]
Hardt, D., Ed., "OAuth 2.0 Authorization Framework", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC7662]
Richer, J., Ed., "OAuth 2.0 Token Introspection", RFC 7662, DOI 10.17487/RFC7662, , <https://www.rfc-editor.org/info/rfc7662>.
[RFC8174]
Leiba, B., "RFC 2119 キーワードにおける大文字と 小文字の曖昧性", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259]
Bray, T., Ed., "JavaScript Object Notation (JSON) データ交換形式", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.

8.2. 参考情報

[OASIS.saml-core-1.1]
Maler, E., Mishra, P., and R. Philpott, "OASIS Security Assertion Markup Language (SAML) V1.1 の アサーションおよびプロトコル", OASIS Standard oasis-sstc-saml-core-1.1, , <https://www.oasis-open.org/committees/download.php/3406/oasis-sstc-saml-core-1.1.pdf>.
[OASIS.saml-core-2.0-os]
Cantor, S., Kemp, J., Philpott, R., and E. Maler, "OASIS Security Assertion Markup Language (SAML) V2.0 のアサーションおよびプロトコル", OASIS Standard saml-core-2.0-os, , <http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf>.
[OAUTH-RESOURCE]
Campbell, B., Bradley, J., and H. Tschofenig, "OAuth 2.0 の Resource Indicators", 進行中の作業, Internet-Draft, draft-ietf-oauth-resource-indicators-08, , <https://tools.ietf.org/html/draft-ietf-oauth-resource-indicators-08>.
[OAUTH-SECURITY]
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, "OAuth 2.0 Security Best Current Practice", 進行中の作業, Internet-Draft, draft-ietf-oauth-security-topics-13, , <https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13>.
[OpenID.Core]
Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore, "OpenID Connect Core 1.0", , <https://openid.net/specs/openid-connect-core-1_0.html>.
[RFC6750]
Jones, M. and D. Hardt, "OAuth 2.0 Authorization Framework: Bearer Token Usage", RFC 6750, DOI 10.17487/RFC6750, , <https://www.rfc-editor.org/info/rfc6750>.
[RFC6755]
Campbell, B. and H. Tschofenig, "OAuth のための IETF URN サブ名前空間", RFC 6755, DOI 10.17487/RFC6755, , <https://www.rfc-editor.org/info/rfc6755>.
[RFC6819]
Lodderstedt, T., Ed., McGloin, M., and P. Hunt, "OAuth 2.0 脅威モデルおよび セキュリティ上の考慮事項", RFC 6819, DOI 10.17487/RFC6819, , <https://www.rfc-editor.org/info/rfc6819>.
[RFC7521]
Campbell, B., Mortimore, C., Jones, M., and Y. Goland, "OAuth 2.0 クライアント認証および認可 グラントのためのアサーションフレームワーク", RFC 7521, DOI 10.17487/RFC7521, , <https://www.rfc-editor.org/info/rfc7521>.
[RFC7523]
Jones, M., Campbell, B., and C. Mortimore, "OAuth 2.0 クライアント認証および認可グラントのための JSON Web Token (JWT) プロファイル", RFC 7523, DOI 10.17487/RFC7523, , <https://www.rfc-editor.org/info/rfc7523>.
[WS-Trust]
Nadalin, A., Ed., Goodner, M., Ed., Gudgin, M., Ed., Barbir, A., Ed., and H. Granqvist, Ed., "WS-Trust 1.4", , <https://docs.oasis-open.org/ws-sx/ws-trust/v1.4/ws-trust.html>.

付録 A. 追加のトークン交換 例

以下のセクションでは、なりすましと委任をそれぞれ示す 2 つのトークン交換例が提供される (表示目的のみの余分な改行およびインデントを含む)。

A.1. なりすましトークン 交換例

A.1.1. トークン交換 リクエスト

以下のトークン交換リクエストでは、クライアントは なりすましセマンティクスを持つトークンを要求している (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
図 10: トークン交換 リクエスト

A.1.2. Subject Token クレーム

前のリクエストの subject_token は JWT であり、 デコードされた JWT Claims Set がここに示されている。JWT は 特定の時間枠内で認可サーバーによって消費されることを意図している。 JWT の subject (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"
  }
図 11: Subject Token クレーム

A.1.3. トークン交換 レスポンス

以下に示すトークン交換レスポンスの access_token パラメーターは、 クライアントが要求した新しいトークンを含む。 レスポンスの他のパラメーターは、そのトークンが 1 時間で期限切れとなる bearer アクセストークンであることを示す。

 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
 }
図 12: トークン交換 レスポンス

A.1.4. 発行されたトークンの クレーム

発行されたトークンのデコードされた JWT Claims Set を以下に示す。新しい JWT は 認可サーバーによって発行され、論理名 urn:example:cooperation-context で知られるシステムエンティティによって、その有効期限前であればいつでも消費されることを意図している。 JWT の subject (sub) は、リクエストを行うために使用されたトークンの subject と同じであり、 これにより、クライアントはトークンを使用することにより、 urn:example:cooperation-context の論理名で知られる システムエンティティにおいて、その subject になりすますことが 事実上可能になる。

  {
    "aud":"urn:example:cooperation-context",
    "iss":"https://as.example.com",
    "exp":1441913610,
    "sub":"bdc@example.net",
    "scope":"orders profile history"
  }
図 13: 発行されたトークンのクレーム

A.2. 委任トークン 交換例

A.2.1. トークン交換 リクエスト

以下のトークン交換リクエストでは、クライアントはトークンを要求し、 subject_tokenactor_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
図 14: トークン交換 リクエスト

A.2.2. Subject Token クレーム

前のリクエストの subject_token は JWT であり、 デコードされた JWT Claims Set がここに示されている。JWT は 特定の有効期限前に認可サーバーによって消費されることを 意図している。 JWT の subject (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"
    }
  }
図 15: Subject Token クレーム

A.2.3. Actor Token クレーム

前のリクエストの actor_token は JWT であり、 デコードされた JWT Claims Set がここに示されている。この JWT もまた、 特定の有効期限前に認可サーバーによって消費されることを 意図している。 JWT の subject (admin@example.net) は、 要求されているセキュリティトークンを行使する actor である。

  {
    "aud":"https://as.example.com",
    "iss":"https://original-issuer.example.net",
    "exp":1441910060,
    "sub":"admin@example.net"
  }
図 16: Actor Token クレーム

A.2.4. トークン交換 レスポンス

以下に示すトークン交換レスポンスの 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
 }
図 17: トークン交換 レスポンス

A.2.5. 発行されたトークンの クレーム

発行されたトークンのデコードされた JWT Claims Set を以下に示す。新しい JWT は 認可サーバーによって発行され、論理名 urn:example:cooperation-context で知られるシステムエンティティによって、 その有効期限前であればいつでも消費されることを意図している。 JWT の subject (sub) は、リクエストを行うために使用された subject_token の subject と同じである。 JWT の actor (act) は、リクエストを行うために使用された actor_token の subject と同じである。 これは委任を示し、 admin@example.net を、user@example.net の代理として 動作する権限が委任された現在の actor として識別する。

  {
    "aud":"urn:example:cooperation-context",
    "iss":"https://as.example.com",
    "exp":1441913610,
    "scope":"status feed",
    "sub":"user@example.net",
    "act":
    {
      "sub":"admin@example.net"
    }
  }
図 18: 発行されたトークンのクレーム

謝辞

本仕様は 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, and Hannes Tschofenig

著者の連絡先

Michael B. Jones
Microsoft
Anthony Nadalin
Microsoft
Brian Campbell (editor)
Ping Identity
John Bradley
Yubico
Chuck Mortimore
Visa