8.5. 参加者トークンの要求
要求者トークン (RPT) は、JSON Web 署名 (JWS) を使用してデジタル署名された JSON Web トークン (JWT) です。トークンは、Red Hat build of Keycloak が特定のクライアントに対して以前に発行した OAuth2 アクセストークンに基づき、ユーザーまたは自身の代わりに作成されます。
RPT をデコードすると、以下のようなペイロードが表示されます。
{ "authorization": { "permissions": [ { "resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7", "resource_set_name": "Hello World Resource" } ] }, "jti": "d6109a09-78fd-4998-bf89-95730dfd0892-1464906679405", "exp": 1464906971, "nbf": 0, "iat": 1464906671, "sub": "f1888f4d-5172-4359-be0c-af338505d86c", "typ": "kc_ett", "azp": "hello-world-authz-service" }
このトークンから、サーバーから付与されたすべてのパーミッションを permissions 要求から取得できます。
また、パーミッションは、実際に付与して、これらの同じ権限を発行するために使用されたアクセス制御メソッドから保護および完全に分離しているリソース/スコープと直接関連する点にご留意ください。
8.5.1. 要求するトークンのイントロスペクション
場合によっては、リクエスト側のトークン (RPT) をイントロスペクションして、トークン内のパーミッションを確認するか、リソースサーバー側の認可決定を実施したい場合があります。
トークンイントロスペクションが役立つ主なユースケースは 2 つあります。
- クライアントアプリケーションがトークンの有効性をクエリーして、同じまたは追加のパーミッションを持つ新しいパーミッションを取得する必要がある場合は、
- リソースサーバーで認可の決定を強制する場合 (特に組み込みの ポリシーエンフォーサー がお使いのアプリケーションに適さない場合)
8.5.2. RPT に関する情報の取得
トークンイントロスペクションは基本的に OAuth2 トークンイントロスペクション に準拠するエンドポイントであり、そこから RPT に関する情報を取得できます。
http://${host}:${port}/realms/${realm_name}/protocol/openid-connect/token/introspect
このエンドポイントを使用して RPT をイントロスペクションするには、以下のようにサーバーにリクエストを送信します。
curl -X POST \ -H "Authorization: Basic aGVsbG8td29ybGQtYXV0aHotc2VydmljZTpzZWNyZXQ=" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d 'token_type_hint=requesting_party_token&token=${RPT}' \ "http://localhost:8080/realms/hello-world-authz/protocol/openid-connect/token/introspect"
上記の要求では HTTP BASIC を使用して、クライアントのクレデンシャル (クライアント ID およびシークレット) を渡して、トークンのイントロスペクションを試みるクライアントを認証していますが、Red Hat build of Keycloak でサポートされる他のクライアント認証方法を使用できます。
イントロスペクションエンドポイントには 2 つのパラメーターが必要です。
token_type_hint
このパラメーターの値として requesting_party_token を使用します。これは、RPT をイントロスペクションする必要があることを示します。
token
このパラメーターの値として、認可プロセス中にサーバーが返したためトークン文字列を使用します。
その結果、サーバーの応答は以下のようになります。
{ "permissions": [ { "resource_id": "90ccc6fc-b296-4cd1-881e-089e1ee15957", "resource_name": "Hello World Resource" } ], "exp": 1465314139, "nbf": 0, "iat": 1465313839, "aud": "hello-world-authz-service", "active": true }
RPT がアクティブでない場合は、代わりに以下の応答が返されます。
{ "active": false }
8.5.3. RPT をイントロスペクションするたびにサーバーを呼び出す必要がありますか?
いいえ。Red Hat build of Keycloak サーバーが発行した通常のアクセストークンと同様に、RPT はデフォルトの形式として JSON Web トークン (JWT) 仕様も使用します。
リモートイントロスペクションエンドポイントへの呼び出しなしにこれらのトークンを検証する場合は、RPT をデコードし、その妥当性についてクエリーできます。トークンをデコードしたら、トークン内のパーミッションを使用して認可決定を実施することもできます。
これは基本的に、ポリシーエンフォーサーの動作です。必ず以下を行なってください。
- RPT の署名を検証します (レルムの公開鍵に基づく)
- exp、iat、および aud の要求に基づくトークンの有効性についてクエリー