Logo Logo
GitHub Designed by Logto

リソースインジケーター (Resource indicator)とは?

リソースインジケーター(Resource indicator)は、OAuth 2.0 の拡張 RFC 8707 で定義されているパラメーターで、クライアントが 認可要求 (Authorization request) (または OpenID Connect (OIDC) での 認証要求 (Authentication request) )や トークンリクエスト (Token request) 内でリソースサーバーの URI を指定することを可能にします。リソースインジケーターは、クライアントがアクセスしたいリソースサーバーの位置を示すために使用されます。

[!Note] リソースインジケーター(Resource indicator)は、OAuth 2.0 のコア仕様には含まれない拡張パラメーターです。このパラメーターをサポートしているかどうか、利用する 認可サーバー (Authorization Server) のドキュメントを確認してください。

リソースインジケーターはどのように動作するのか?

リソースインジケーターがどのように機能するかをよりよく理解するために、単一の認可サーバーを使用して複数の リソースサーバー にアクセスしたいとする クライアント (Client) のシナリオを考えてみましょう。

1. リソースサーバーの登録

通常、開発者はクライアントに利用可能にするために、各リソースサーバーを認可サーバーに登録する必要があります。実際の登録プロセスは、認可サーバーの実装によって異なる場合があります。機能名は「API リソース」や単に「リソース」など異なるかもしれません。

クライアントが https://api.example.comhttps://api.another.com の2つのリソースサーバーにアクセスしたいと仮定し、それらが認可サーバーに登録されているとします。

2. 各リソースサーバーのスコープを定義

従来の OAuth 2.0 フローでは スコープ がすべてのリソースサーバー間で共有されますが、リソースインジケーター拡張を使用すると、クライアントは各リソースサーバーに対するスコープを指定することができます。これもまた登録プロセスの一部であるべきです。以下のスコープを持つリソースサーバーがあると仮定します:

リソースサーバースコープ
https://api.example.comread, write
https://api.another.comread, delete

3. 認可リクエストにリソースインジケーターを含める

リソースインジケーター拡張を使用したいことを認可サーバーに通知するために、クライアントは認可リクエストに resource パラメーターを含めるべきです。

リソースインジケーターを含む認可リクエストの非規範的な例を以下に示します:

GET /authorize?response_type=code
  &client_id=YOUR_CLIENT_ID
  &redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
  &scope=openid%20profile%20email%20read
  &state=abc123
  &nonce=123456
  &resource=https%3A%2F%2Fapi.example.com HTTP/1.1

この例では、クライアントは resource パラメーターにエンコードされた値 https%3A%2F%2Fapi.example.com を含め、リソースサーバーの位置(https://api.example.com)を示しています。

また、openid などの事前定義されたスコープとともにリソース固有のスコープも含めていることに注意してください。認可サーバーはスコープを検証し、要求されたリソースサーバーに関連付けられていないその他のスコープをフィルタリングする必要があります。これを downscoping と呼びます。

クライアントが受け取ることが期待される実際の4つのスコープの表は次のとおりです:

リソースサーバースコープ
N/Aopenid, profile, email
https://api.example.comread

リソースインジケーターの利点は、クライアントが resource パラメーターを繰り返すことで、単一の認可リクエストで複数のリソースサーバーを要求できることです。もう一つの例を見てみましょう:

GET /authorize?response_type=code
  &client_id=YOUR_CLIENT_ID
  &redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
  &scope=openid%20profile%20email%20read%20write%20delete
  &state=abc123
  &nonce=123456
  &resource=https%3A%2F%2Fapi.example.com
  &resource=https%3A%2F%2Fapi.another.com HTTP/1.1

この例では、クライアントはそれぞれのスコープで https://api.example.comhttps://api.another.com の両方へのアクセスを要求しています。認可サーバーは各リソースサーバーに対するスコープを検証し、つまりスコープとリソースサーバーの 直積 (Cartesian product) を行う必要があります。その結果は次のようになるはずです:

リソースサーバースコープ
N/Aopenid, profile, email
https://api.example.comread, write
https://api.another.comread, delete

この認可リクエストの有効なスコープは合計で7つです。

4. トークンリクエストにリソースインジケーターを含める

クライアントが認可コードを受け取ったら、必要に応じて 単一 のリソースインジケーターでアクセストークンと交換することができます。例えば:

POST /token HTTP/1.1
Host: your-authorization-server.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
  &code=AUTHORIZATION_CODE
  &redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
  &client_id=YOUR_CLIENT_ID
  &client_secret=YOUR_CLIENT_SECRET
  &resource=https%3A%2F%2Fapi.example.com

トークンリクエストの resource パラメーターはオプションです。クライアントがこれを含めた場合、認可サーバーは現在のグラントに関連付けられたスコープに対してリソースインジケーターを検証するべきです。それ以外の場合は、認可サーバーはグローバルスコープにフォールバックする必要があります(例: OpenID Connect (OIDC) スコープ)。

[!Note] 認可サーバーは常に アクセス制御 (Access control) を適用し、発行されたアクセストークンが有効で、現在のグラントコンテキストに基づいて適切にダウンスコープされていることを確認する必要があります。

グラント内で複数のリソースサーバーをどのように扱うか疑問に思うかもしれません。認可コードは1回限りの使用であるため、クライアントは他のリソースサーバーのアクセストークンを取得するために リフレッシュトークン (Refresh token) グラントなどを使用することができます。

なぜリソースインジケーターが必要なのか?

前述の例からわかるように、リソースインジケーター拡張は、スコープの競合を心配することなく、複数のリソースサーバーを処理するためのスケーラブルな方法を提供します。これは、クライアントが異なるリソースサーバーからリソースにアクセスするための柔軟性を提供する強力な機能です。

リソースインジケーター拡張は、OAuth 2.0 のコア仕様の一部ではないことに注意してください。アプリケーションで使用する前に、認可サーバーがこの拡張をサポートしていることを確認してください。

関連項目