9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Digital Identity技術勉強会 #iddanceAdvent Calendar 2021

Day 2

Grant Management for OAuth 2.0

Last updated at Posted at 2021-12-01

はじめに

Grant Management for OAuth 2.0(グラント管理)は、クライアントアプリケーションに付与された権限を管理するための技術仕様で、既存の標準仕様よりも細かい粒度での管理を可能にします。

英国オープンバンキングオーストラリア消費者データ権ブラジルオープンバンキング 等のエコシステムで採用され、高度 API セキュリティのデファクトスタンダードとなった Financial-grade API 1.0、その後継仕様である Financial-grade API 2.0 の一部と位置付けられていることが、この仕様に注目すべき理由となっています。また、グラント管理仕様は、インターネット上に世界規模の高信頼性デジタルアイデンティティネットワークを構築するためのプロジェクトである GAIN (Global Assured Identity Network) のホワイトペーパーでも言及されています。

本記事は Authlete 社のウェブサイト上で公開されている『グラント管理(Grant Management for OAuth 2.0)』の仕様説明部分の要約です。当仕様の実装詳細にご興味のある方は Authlete 社の記事を参照してください。

グラントの概念

OAuth 2.0 では、ユーザーはクライアントアプリケーションに権限を与えます。結果として、認可サーバーからクライアントアプリケーションにアクセストークンが発行されます。

アクセストークン発行処理は繰り返されるかもしれません。二番目以降の処理でクライアントが要求する権限は最初の処理で要求されたものとは異なるかもしれません。このようにして、クライアントアプリケーションに与えられる権限は累積していきます。

グラント管理仕様では累積した権限をグラントと呼び、グラントに関する問い合わせ、グラントの累積および失効の手段を定義します。

grant.ja.png

リクエストパラメーター/レスポンスパラメーター

グラントを管理するため、各グラントにはグラント ID が割り当てられます。グラント ID はアクセストークンとともにトークンエンドポイントから発行されます。認可サーバーにグラント ID の発行を要求するには、新しい認可リクエストパラメーターである grant_management_actioncreate という値を指定し、認可リクエストに含めます。発行されたグラント ID は、新しいトークンレスポンスパラメーターである grant_id の値としてトークンレスポンスに含まれます。

grant_management_action-create.ja.png

権限を累積させるには、続く認可リクエストに grant_management_action=merge および新しい認可リクエストパラメーター grant_id を含めます。grant_id の値には発行済みのグラント ID を指定します。

grant_management_action-merge.ja.png

FAPI PR 344 により、updatemerge へと名称変更されました。この変更は Grant Management for OAuth 2.0 の実装者向け草稿第二版から有効になります。

createmerge に加え、grant_management_action リクエストパラメーターの値として replace も定義されています。replace アクションは、指定したグラント ID に紐付く権限を、grant_management_action=replace を含むリクエストで付与された権限だけで置き換えます。以前の権限は取り消されます。

grant_management_action-replace.ja.png

grant_management_action リクエストパラメーターの値が merge または replace の場合、grant_id リクエストパラメーターは必須です。

グラント管理エンドポイント

グラント管理仕様では、グラント管理エンドポイントと呼ばれる新しいエンドポイントを定義しています。このエンドポイントにより、グラントに関する問い合わせとグラントの失効が可能となります。エンドポイントにアクセスするには、事前に発行されたアクセストークンが必要となります。

問い合わせ

問い合わせ
リクエスト HTTP メソッド GET
URL {エンドポイント}/{グラントID}
保護 grant_management_query スコープを持つアクセストークン
レスポンス ステータスコード 200 OK
Content-Type application/json
フォーマット "6.4. Query Status of a Grant" 参照

次のものは、グラント管理仕様の "6.4. Query Status of a Grant" から抜粋したレスポンス例です。

grant-status.ja.png

レスポンスボディーの JSON はグラントの権限を示しています。トップレベルのプロパティーとして "scopes", "claims", "authorization_details" が含まれています。

scopes

"scopes" の値は、スコープとリソースの(以降スコープリソースクラスター)の配列です。各クラスターは "scope""resource" で構成されます。"scope" の値は空白区切りで並べたスコープ群です。"resource" の値はリソースの配列です。スコープ群とリソース群の値は scope リクエストパラメーター(RFC 6749 / Section 3.3)と resource リクエストパラメーター(RFC 8707 / Section 2)で指定されたものです。

"scopes" の構造から、merge 操作の繰り返しにより権限が累積してもスコープリソースクラスター群は分けて管理すべきということに実装者は気が付きます。もしも merge 操作でクラスター群の内容が混ざってしまうと、スコープ群が意図しないリソース群と組み合わされてしまうかもしれません。下図内の右下の JSON は、クラスター群の内容を混ぜてしまうと change スコープが https://payment.example.com リソースに関連付けられてしまうことを示しており、これは、金銭の窃取などの重大なセキュリティ事件を引き起こしかねません。

scope-resource-cluster.ja.png

claims

"claims" の値は、ユーザーがクライアントアプリケーションに知ることを許可した「クレーム」の配列です。簡単に言うと、ここでの「クレーム」とはユーザーの属性のことです。family_namephone_number などのユーザー属性のいくつかは、OpenID Connect Core 1.0Section 5.1 で標準クレームとして定義されています。

クライアントアプリケーションは、特別なスコープ(profileemailaddressphone)を scope リクエストパラメーターに含めることにより(OIDC Core / Section 5.4)、または claims リクエストパラメーターを使うことにより(OIDC Core / Section 5.5)、クレームを要求することができます。

requesting-claims.ja.png

authorization_details

"authorization_details" の値は認可に関する詳細情報の配列です。それらの情報は、"OAuth 2.0 Rich Authorization Requests"(RAR)で定義される authorization_details リクエストパラメーターで指定されたものです。

RAR が開発される前は、認可リクエストに詳細情報を含めるために認可サーバーは非標準リクエストパラメーターを導入するか、または scope リクエストパラメーターを非標準の方法で利用しなければなりませんでした。後者の方法は「parameterized scope」や「dynamic scope」と呼ばれ、動的な値をスコープ文字列に埋め込みます。例えば、Open Banking Brasil Financial-grade API Security Profile 1.0 は「動的同意スコープ」(Section 7.1.2)を定義しています。そのフォーマットは consent:{ConsentID} となっており、consent: が固定文字列のプレフィックス、{ConsentID} が動的部分です(例: consent:urn:bancoex:C1DD33123)。

動的スコープの問題は、標準化されていないこと、および、それ自身に起因する特性として書式が多岐に渡ることにより、実装間の互換性に全く期待できないことです。RAR はその問題を解決するために開発され、Financial-grade API 2.0 の一部として位置付けられています。

authorization_details.png

失効

失効
リクエスト HTTP メソッド DELETE
URL {エンドポイント}/{グラントID}
保護 grant_management_revoke スコープを持つアクセストークン
レスポンス ステータスコード 204 No Content

グラント管理仕様は、失効するグラントに紐付く全てのリフレッシュトークンも失効しなければならず(MUST)、アクセストークンも失効すべき(SHOULD)と述べています。

アクセストークンとリフレッシュトークンの実装は、認可サーバーの実装間で異なります。特に、PKI の CRL(Certificate Revocation List)または OCSP(Online Certificate Status Protocol)相当の仕組みを運用しない限り、JWT アクセストークンをはじめとする内包型アクセストークンは失効できないことに注意してください。詳細は『OAuth アクセストークンの実装に関する考察』を参照してください。

サーバーメタデータ

グラント管理仕様は次のサーバーメタデータを追加します。

メタデータ 説明
grant_management_actions_supported 認可サーバーがサポートするグラント管理アクション群。取りうる値は create, query replace, revoke および merge.
grant_management_endpoint グラント管理エンドポイントの URL
grant_management_action_required grant_management_action リクエストパラメーターが常に要求されるかどうかを示す真偽値

セキュリティ上の理由により、グラント管理はコンフィデンシャルクライアントのみしか利用できないので("grant management is restricted to confidential only clients due to security reasons"Section 5.1))、ディスカバリー文書(OIDC Discovery)が "grant_management_action_required":true を含んでいる場合、それは当認可サーバーの認可エンドポイントがパブリッククライアントからのリクエストを全て拒絶することを示唆しています。

さいごに

Grant Management for OAuth 2.0 は Authlete 2.3 以降でサポートされます。現時点では、当バージョンは共有サーバー(api.authlete.com)にデプロイされていません。Authlete 2.3 へのアーリーアクセスをご希望の場合はお問い合わせください。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?