PDP (with OPA) を実装して OpenID AuthZEN Interop を試してみた!
Digital Identity技術勉強会 #iddance Advent Calendar 2024 8 日目の記事です。
はじめに
本記事では、OpenID AuthZEN Interop[1] をパスするための Policy Decision Point (PDP) を自作した際のことを備忘録的に残します。
OpenID AuthZEN Interop[1:1] とは、OpenID Foundation の AuthZEN Working Group にて策定が進められている Authorization API[2] という仕様との相互運用性を確認するためのテストです。具体的には、PDP に対して Authorization API 仕様にて定義されているリクエストが送信され、期待されたシナリオの通りの結果を返していることがチェックされます。
本記事で紹介する PDP は Go 言語で実装しており、以下の GitHub リポジトリにて公開しています。Policy の評価には Open Policy Agent (OPA)[3] を使用しています。あくまで実験的な実装であり、細部まで作り込んでいるわけではないですが、OpenID AuthZEN Interop をパスできることを確認しています。
なお、当該実装は Authorization API 1.1 – draft 01^4 を参照しています。仕様のバージョンによって Access Evaluation API のパラメーターなどに大きな差異があるように見受けられました。その他のバージョンに対応した AuthZEN Interop をパスするためには追加で変更が必要になる点にご留意ください。
Attribute Based Access Control (ABAC) の構成要素
本記事で紹介している OpenID AuthZEN Interop と直接的には関係ないですが、OpenID AuthZEN Interop や Authorization API 仕様を理解するうえで、Attribute Based Access Control (ABAC) の構成要素について知っておくと良さそうなので、ここで触れておきます。
以下の図は "NIST SP 800-162 Guide to Attribute Based Access Control (ABAC) Definition and Considerations"[4] から引用してきた図になります。前述の Policy Decision Point (PDP) や Policy Enforcement Point (PEP)、Policy Administration Point、Policy Information Point (PIP) といった複数のコンポーネントによって構成されていることが確認できます。
An Example of ACM Functional Points [4:1]
NIST SP 800-162 における各コンポーネントの説明は以下の通りです。
- Digital Policy (DP): Access control rules that compile directly into machine executable codes or signals. Subject/object attributes, operations, and environment conditions are the fundamental elements of DP, the building blocks of DP rules, which are enforced by an access control mechanism.
- Metapolicy (MP): A policy about policies, or policy for managing policies, such as assignment of priorities and resolution of conflicts between DPs or other MPs.
- Policy Decision Point (PDP): Computes access decisions by evaluating the applicable DPs and MPs. One of the main functions of the PDP is to mediate or deconflict DPs according to MPs.
- Policy Enforcement Point (PEP): Enforces policy decisions in response to a request from a subject requesting access to a protected object; the access control decisions are made by the PDP.
- Policy Information Point (PIP): Serves as the retrieval source of attributes, or the data required for policy evaluation to provide the information needed by the PDP to make the decisions.
- Policy Administration Point (PAP): Provides a user interface for creating, managing, testing, and debugging DPs and MPs, and storing these policies in the appropriate repository.
本記事において主な対象となる PDP に関してざっくりいうと、PAP によって作成された DP と MP、PIP によって提供される属性などの情報をもとに、PEP がサブジェクトから受け取った要求を評価するというアクセス決定をおこなうといったことになります。
OpenID AuthZEN Interop
OpenID AuthZEN Working Group に関連するリソースは以下のリポジトリ上に配置されており、OpenID AuthZEN Interop に関連する実装なども基本的にはこのリポジトリ上に存在しています。
なお、AuthZEN Interop に関する詳細については以下のページにアクセスして確認するのが良いと思います。AuthZEN Interop で実施されるシナリオの詳細や、過去にこのテストをパスしたプロダクトの実績などを確認することができます。なお、シナリオは仕様のバージョンごとに用意されており、リクエストパラメーターなどが異なる点に注意が必要です。
TODO Application
AuthZEN Interop では TODO Application と呼ばれるアプリケーションをもとにおこなわれます。
TODO Application の実装は以下のリポジトリの interop/
以下に配置されており、authzen-todo-application
がフロントエンド、authzen-todo-backend
がバックエンドの実装になっています。
ざっくりですが、動作としては以下のようになっています。ユーザーが authzen-todo-application
にアクセスして操作をおこなうと、バックエンドのauthzen-todo-backend
にリクエストが送信されます。次に authzen-todo-application
のミドルウェアから起動時に指定した PDP に対してリクエストが行われ、PDP で評価を行なって結果が返されます。
このとき、authzen-todo-backend (PEP)
から PDP へのリクエストが Authorization API 仕様[5]の "The Access Evaluation API Request" に基づいており、PDP から authzen-todo-backend (PEP)
へのレスポンスが "The Access Evaluation API Response" に基づいています。
Frontend
フロントエンドは、interop/authzen-todo-application/
ディレクトリに移動して以下のコマンドを実行することで起動することができます。README.md に記載の通り、.env
の設定でバックエンドを変更することなどができます。
$ yarn
$ yarn start
フロントエンドが起動したら、README に記載の Email とパスワードでサインインすることで以下のような画面を開くことができます。なお、このとき事前に後述のバックエンドを起動しておいた方が良いでしょう。
Backend
バックエンドは、 interop/authzen-todo-backend/
ディレクトリに移動して以下のコマンドを実行することで起動することができます。また、フロントエンドと同様に、README に記載の通り .env
を配置することで利用する PDP などを変更することができます (コード を見ていたら環境変数で LOG_LEVEL の設定ができそうで便利でした)。
$ yarn
$ yarn dev
設定がうまくいっていた場合、アプリケーションを操作することで以下のように設定した PDP に対してリクエストが送信されることを確認できると思います。
$ yarn dev
...
Authorizer: http://localhost:8001/access/v1/evaluation
{
subject: {
type: 'user',
id: 'CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs',
identity: 'CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs'
},
action: { name: 'can_read_user' },
resource: {
type: 'user',
id: 'CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs',
userID: 'CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs'
},
context: {}
}
{ decision: true, context: { reason_admin: {}, reason_user: {} } }
Test
PDP に対するテストは authzen-todo-backend
を使用して実行することができます。
interop/authzen-todo-backend/
ディレクトリに移動して以下の通りコマンドを実行することで、指定した PDP に対してテストのためのリクエストが送信され、意図した通りのレスポンスであれば PASS
、意図した通りのレスポンスでなければ FAIL
として表示されます。
$ yarn build
$ yarn test http://localhost:8001
yarn run v1.22.22
$ node build/test/runner.js http://localhost:8001
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"rick@the-citadel.com"}}
...
サンプル PDP 実装
ここまでで、OpenID AuthZEN Interop の概要を説明しました。ここからは、実際に OpenID AuthZEN Interop を実行し、テストをパスするための以下の PDP 実装の説明をします。
まず、PEP から送信される Access Evaluation API Request を評価して Access Evaluation API Response を返すためには、評価に必要なポリシーおよびポリシーを評価する上で必要な属性情報を取得する必要があります。
通常であれば、それぞれ PAP (Policy Repository) や PIP から取得するところですが、今回は簡易的な実装なため、それらのコンポーネントの実装および取得処理は省略しています。ポリシーについては、policy/todoapp.rego
に配置しており、属性情報などについては pip/pip.go
から取得できるようにしています。
これらの情報の出所ですが、ポリシーについては AuthZEN Interop の Overview of the scenario に記載の内容をポリシー (Rego) に落とし込んでいます。OpenID AuthZEN Interop に関して言えば、そこまで複雑なシナリオは無かった印象なので、基本的には、「だれ (subject/role) が何 (resource) にどうすること (action) を許可されているか」という点を押さえてあがれば問題ないと思います。
PIP からの属性情報については、 AuthZEN Interop の Attributes associated with users (expected to come from PIP) に記載があり、基本的には Go 言語のシンタックスに合わせてコピペしているだけです。
ここまでできたら、あとはこれらの情報使って PDP として評価するだけです。具体的な実装は pdp/pdp.go
にあるのでこちらを必要に応じて参照してください。
処理としては、例えば PDP に対して以下のような Access Evaluation API Request が送信されてくるので、前述のポリシーなどを使用してリクエストを評価します。
{
"subject": {
"type": "user",
"id": "CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"
},
"action": {
"name": "can_update_todo"
},
"resource": {
"type": "todo",
"id": "7240d0db-8ff0-41ec-98b2-34a096273b92",
"properties": {
"ownerID": "rick@the-citadel.com"
}
}
}
その後、評価した結果を元に、例えば以下のような Access Evaluation API Response を組み立てて返します。このとき、decision
の値が期待されたものであれば PASS
として判定され、そうでなければ FAIL
として判定されます。
{
"decision": false,
"context": {
"reason_admin": {},
"reason_user": {}
}
}
動作確認
最後に、サンプル実装を使用した動作確認の方法とその結果です。
今回のサンプル実装は以下の通り起動させることができます。デフォルトでは 8001
番ポートで起動します。
$ go run main.go
2024/12/08 04:08:09 INFO Starting server port=8001
次に authzen-todo-backend
の以下のコマンドを実行して起動した PDP に対してテストを行います。
$ yarn test http://localhost:8001
yarn run v1.22.22
$ node build/test/runner.js http://localhost:8001
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"rick@the-citadel.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_todos"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_create_todo"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b91","properties":{"ownerID":"morty@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDA2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b91","properties":{"ownerID":"morty@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"morty@the-citadel.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_todos"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_create_todo"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","_note":"ID for Morty","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b91","properties":{"ownerID":"morty@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDE2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b91","properties":{"ownerID":"morty@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"summer@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_todos"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_create_todo"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b93","properties":{"ownerID":"summer@the-smiths.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDI2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b93","properties":{"ownerID":"summer@the-smiths.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_todos"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_create_todo"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b94","properties":{"ownerID":"beth@the-smiths.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDM2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b94","properties":{"ownerID":"beth@the-smiths.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"beth@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_user"},"resource":{"type":"user","id":"jerry@the-smiths.com"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_read_todos"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_create_todo"},"resource":{"type":"todo","id":"todo-1"}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_update_todo"},"resource":{"type":"todo","id":"240d0db-8ff0-41ec-98b2-34a096273b95","properties":{"ownerID":"jerry@the-smiths.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"7240d0db-8ff0-41ec-98b2-34a096273b92","properties":{"ownerID":"rick@the-citadel.com"}}}
PASS REQ: {"subject":{"type":"user","id":"CiRmZDQ2MTRkMy1jMzlhLTQ3ODEtYjdiZC04Yjk2ZjVhNTEwMGQSBWxvY2Fs"},"action":{"name":"can_delete_todo"},"resource":{"type":"todo","id":"240d0db-8ff0-41ec-98b2-34a096273b95","properties":{"ownerID":"jerry@the-smiths.com"}}}
✨ Done in 0.42s.
どうやらすべて PASS
になったようです。ではまた!
-
OpenID AuthZEN Interop https://authzen-interop.net/ ↩︎ ↩︎
-
AuthZEN Working Group - Specifications https://openid.net/wg/authzen/specifications/ ↩︎
-
Open Policy Agent https://www.openpolicyagent.org/ ↩︎
-
Guide to Attribute Based Access Control (ABAC) Definition and Considerations | https://csrc.nist.gov/pubs/sp/800/162/upd2/final ↩︎ ↩︎
-
Authorization API 1.1 – draft 01 https://openid.github.io/authzen/authorization-api-1_1_01 ↩︎
Discussion