OpenID Connect (OIDC) クライアントとトークンの伝播
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
第1章 OpenID Connect (OIDC) と OAuth2 クライアントおよびフィルター リンクのコピーリンクがクリップボードにコピーされました!
Quarkus エクステンションは、トークンの取得、更新、伝播に重点を置いて、OpenID Connect および OAuth 2.0 アクセストークンの管理に使用できます。
これには、以下のパラメーターが含まれます。
-
quarkus-oidc-client、quarkus-rest-client-oidc-filter、およびquarkus-resteasy-client-oidc-filterエクステンション。OpenID Connect および Keycloak などの OAuth 2.0 準拠の認可サーバーからアクセストークンを取得および更新するために使用します。 -
quarkus-rest-client-oidc-token-propagationおよびquarkus-resteasy-client-oidc-token-propagationエクステンション。現在のBearerまたはAuthorization Code Flowアクセストークンを伝播するために使用します。
これらのエクステンションによって管理されるアクセストークンは、リモートサービスにアクセスするための HTTP 認可ベアラートークンとして使用できます。
OpenID Connect クライアントとトークンの伝播クイックスタート も参照してください。
1.1. OidcClient リンクのコピーリンクがクリップボードにコピーされました!
次の依存関係を追加します。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-client</artifactId>
</dependency>
quarkus-oidc-client エクステンションは、SmallRye Mutiny Uni および Vert.x WebClient を使用してトークンを取得および更新するのに使用できるリアクティブ io.quarkus.oidc.client.OidcClient を提供します。
OidcClient はビルド時に IDP トークンエンドポイント URL を使用して初期化されます。これは自動検出または手動で設定できます。OidcClient はこのエンドポイントを使用して、client_credentials や password などのトークングラントを使用してアクセストークンを取得し、refresh_token グラントを使用してトークンを更新します。
1.1.1. トークンエンドポイントの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、トークンエンドポイントアドレスは、設定された quarkus.oidc-client.auth-server-url に /.well-known/openid-configuration パスを追加することによって検出されます。
たとえば、次の Keycloak URL があるとします。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
OidcClient は、トークンエンドポイント URL が http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens であることを検出します。
また、検出エンドポイントが使用できない場合、または検出エンドポイントのラウンドトリップを節約したい場合は、検出を無効にして、相対パス値を使用してトークンエンドポイントアドレスを設定できます。以下に例を示します。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus quarkus.oidc-client.discovery-enabled=false # Token endpoint: http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens quarkus.oidc-client.token-path=/protocol/openid-connect/tokens
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus
quarkus.oidc-client.discovery-enabled=false
# Token endpoint: http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens
quarkus.oidc-client.token-path=/protocol/openid-connect/tokens
検出なしでトークンエンドポイント URL を設定するよりコンパクトな方法は、quarkus.oidc-client.token-path を絶対 URL に設定することです。
quarkus.oidc-client.token-path=http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens
quarkus.oidc-client.token-path=http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/tokens
この場合、quarkus.oidc-client.auth-server-url と quarkus.oidc-client.discovery-enabled を設定する必要はありません。
1.1.2. サポートされているトークングラント リンクのコピーリンクがクリップボードにコピーされました!
OidcClient がトークンを取得するために使用できる主なトークングラントは、client_credentials グラント (デフォルト) と password グラントです。
1.1.2.1. クライアントクレデンシャルのグラント リンクのコピーリンクがクリップボードにコピーされました!
OidcClient が client_credentials グラントを使用するように設定する方法は次のとおりです。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
client_credentials グラントにより、quarkus.oidc-client.grant-options.client.<param-name>=<value> を使用してトークンリクエストの追加パラメーターを設定できます。audience パラメーターを使用して、対象のトークンの受信者を設定する方法は次のとおりです。
1.1.2.2. パスワードグラント リンクのコピーリンクがクリップボードにコピーされました!
password グラントを使用するように OidcClient を設定する方法は次のとおりです。
クライアントクレデンシャルのグラントをカスタマイズする方法と同様に、quarkus.oidc-client.grant-options.password 設定接頭辞を使用してさらにカスタマイズできます。
1.1.2.3. その他のグラント リンクのコピーリンクがクリップボードにコピーされました!
OidcClient は、設定でキャプチャーできない追加の入力パラメーターを必要とする許可を使用してトークンを取得するのにも役立ちます。これらの許可は、refresh_token (外部更新トークンを使用)、authorization_code、および現在のアクセストークンを交換するために使用できる 2 つの許可、つまり urn:ietf:params:oauth:grant-type:token-exchange および urn:ietf:params:oauth:grant-type:jwt-bearer です。
アクセストークンを取得する必要があり、既存のリフレッシュトークンを現在の Quarkus エンドポイントにすでに送信した場合は、refresh_token グラントを使用する必要があります。このグラントでは、新しいトークンセットを取得するために、帯域外のリフレッシュトークンを使用します。この場合は、OidcClient を次のように設定します。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret quarkus.oidc-client.grant.type=refresh
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=refresh
次に、提供された更新トークンを使用して OidcClient.refreshTokens メソッドを使用してアクセストークンを取得できます。
複雑なマイクロサービスアプリケーションを構築していて、同じ Bearer トークンが複数のサービスに伝播されて使用されるのを避ける必要がある場合、urn:ietf:params:oauth:grant-type:token-exchange または urn:ietf:params:oauth:grant-type:jwt-bearer グラントの使用が必要になることがあります。詳細は、Quarkus REST のトークン伝播 および RESTEasy Classic のトークン伝播 を参照してください。
何らかの理由で、Quarkus OIDC エクステンション を使用して認可コードフローをサポートできない場合は、OidcClient を使用した authorization code グラントのサポートが必要になる場合があります。認可コードフローを実装する十分な理由がある場合は、次のように OidcClient を設定できます。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret quarkus.oidc-client.grant.type=code
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=code
次に、OidcClient.accessTokens メソッドを使用して、追加プロパティーのマップを受け入れ、現在の code と redirect_uri パラメーターを渡して、トークンの認可コードを交換できます。
OidcClient は、urn:openid:params:grant-type:ciba グラントもサポートします。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=secret quarkus.oidc-client.grant.type=ciba
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=secret
quarkus.oidc-client.grant.type=ciba
次に、OidcClient.accessTokens メソッドを使用して追加プロパティーのマップを受け入れ、auth_req_id パラメーターを渡してトークン認可コードを交換できます。
1.1.2.4. スコープの付与 リンクのコピーリンクがクリップボードにコピーされました!
発行されたアクセストークンに特定のスコープのセットを関連付けるように要求しないといけない場合があります。専用の quarkus.oidc-client.scopes リストプロパティーを使用します (例: quarkus.oidc-client.scopes=email,phone)。
1.1.3. OidcClient の直接使用 リンクのコピーリンクがクリップボードにコピーされました!
OidcClient を直接使用してアクセストークンを取得し、それを Bearer スキーム値として HTTP Authorization ヘッダーに設定できます。
たとえば、ユーザー名を返すマイクロサービスに Quarkus エンドポイントがアクセスする必要があるとします。まず、REST クライアントを作成します。
次に、OidcClient を使用してトークンを取得し、伝播します。
- 1
io.quarkus.oidc.client.runtime.TokensHelperは、アクセストークンの取得と更新を管理します。
1.1.4. トークンの注入 リンクのコピーリンクがクリップボードにコピーされました!
OidcClient を内部的に使用する Tokens を注入できます。Tokens を使用してアクセストークンを取得し、必要に応じて更新することができます。
1.1.5. OidcClients の使用 リンクのコピーリンクがクリップボードにコピーされました!
io.quarkus.oidc.client.OidcClients は OidcClient のコンテナーです。デフォルトの OidcClient と、次のように設定できる名前付きクライアントが含まれています。
quarkus.oidc-client.client-enabled=false quarkus.oidc-client.jwt-secret.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.jwt-secret.client-id=quarkus-app quarkus.oidc-client.jwt-secret.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
quarkus.oidc-client.client-enabled=false
quarkus.oidc-client.jwt-secret.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.jwt-secret.client-id=quarkus-app
quarkus.oidc-client.jwt-secret.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
この場合、デフォルトのクライアントは client-enabled=false プロパティーによって無効になります。jwt-secret クライアントには次のようにアクセスできます。
- 1
- OidcClient の直接使用 セクションの
RestClientWithTokenHeaderParam宣言を参照してください。
OIDC マルチテナンシー も使用しており、各 OIDC テナントに独自の OidcClient が関連付けられている場合は、Vert.x RoutingContext tenant-id 属性を使用できます。以下に例を示します。
プログラムで新しい OidcClient を作成することもできます。たとえば、起動時に OidcClient を作成する必要があるとします。
このクライアントは次のように使用できます。
- 1
- OidcClient の直接使用 セクションの
RestClientWithTokenHeaderParam宣言を参照してください。
1.1.6. 名前付きの OidcClient とトークンの注入 リンクのコピーリンクがクリップボードにコピーされました!
複数の OidcClient オブジェクトが設定されている場合は、OidcClients を使用する代わりに、追加の修飾子 @NamedOidcClient によって OidcClient 注入ターゲットを指定できます。
- 1
- OidcClient の直接使用 セクションの
RestClientWithTokenHeaderParam宣言を参照してください。
同じ修飾子を使用して、Tokens の注入に使用される OidcClient を指定できます。
1.1.7. RestClient Reactive ClientFilter での OidcClient の使用 リンクのコピーリンクがクリップボードにコピーされました!
以下の Maven 依存関係を追加します。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-oidc-filter</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-oidc-filter</artifactId>
</dependency>
io.quarkus:quarkus-oidc-client も追加されます。
quarkus-rest-client-oidc-filter エクステンションは、io.quarkus.oidc.client.filter.OidcClientRequestReactiveFilter を提供します。
これは、OidcClientRequestFilter と同様に機能します (MicroProfile RestClient クライアントフィルターでの OidcClient の使用 を参照)。つまり、OidcClient を使用してアクセストークンを取得し、必要に応じて更新し、HTTP Authorization Bearer スキーム値として設定します。違いは、Reactive RestClient と連携し、トークンを取得または更新するときに現在の IO スレッドをブロックしない非ブロッキングクライアントフィルターを実装することです。
OidcClientRequestReactiveFilter は、IO スレッドのブロックを回避するために、最初のトークンの取得が実行されるまで遅延します。
io.quarkus.oidc.client.reactive.filter.OidcClientFilter または org.eclipse.microprofile.rest.client.annotation.RegisterProvider アノテーションを使用して、OidcClientRequestReactiveFilter を選択的に登録できます。
または
OidcClientRequestReactiveFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.rest-client-oidc-filter.client-name 設定プロパティーを使用して選択できます。@OidcClientFilter アノテーションの value 属性を設定して、OidcClient を選択することもできます。アノテーションを通じて設定されたクライアント名は、quarkus.rest-client-oidc-filter.client-name 設定プロパティーよりも優先されます。たとえば、OIDC クライアント宣言という名前の こちら の jwt-secret がある場合、このクライアントを次のように参照できます。
1.1.8. RestClient ClientFilter での OidcClient の使用 リンクのコピーリンクがクリップボードにコピーされました!
以下の Maven 依存関係を追加します。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-client-oidc-filter</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-client-oidc-filter</artifactId>
</dependency>
io.quarkus:quarkus-oidc-client も追加されます。
quarkus-resteasy-client-oidc-filter エクステンションは、io.quarkus.oidc.client.filter.OidcClientRequestFilter Jakarta REST ClientRequestFilter を提供します。これは、OidcClient を使用してアクセストークンを取得し、必要に応じて更新し、HTTP Authorization Bearer スキーム値として設定します。
デフォルトでは、このフィルターは、初期化時に OidcClient がアクセストークンと更新トークンの最初のペアを取得するようにします。アクセストークンの有効期間が短く、更新トークンが利用できない場合は、quarkus.oidc-client.early-tokens-acquisition=false を使用してトークンの取得を遅らせる必要があります。
io.quarkus.oidc.client.filter.OidcClientFilter または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかのアノテーションを使用して、OidcClientRequestFilter を選択的に登録できます。
または
または、quarkus.resteasy-client-oidc-filter.register-filter=true プロパティーが設定されている場合、OidcClientRequestFilter はすべての MP Rest または Jakarta REST クライアントに自動的に登録できます。
OidcClientRequestFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.resteasy-client-oidc-filter.client-name 設定プロパティーを使用して選択できます。@OidcClientFilter アノテーションの value 属性を設定して、OidcClient を選択することもできます。アノテーションを通じて設定されたクライアント名は、quarkus.resteasy-client-oidc-filter.client-name 設定プロパティーよりも優先されます。たとえば、OIDC クライアント宣言という名前の こちら の jwt-secret がある場合、このクライアントを次のように参照できます。
1.1.9. カスタム RestClient ClientFilter を使用する リンクのコピーリンクがクリップボードにコピーされました!
必要に応じて、独自のカスタムフィルターを使用して Tokens を注入することもできます。
Tokens プロデューサーはトークンを取得して更新し、カスタムフィルターはトークンの使用方法とタイミングを決定します。
名前付きの Tokens を注入することもできます。名前付きの OidcClient とトークンの注入 を参照してください。
1.1.10. アクセストークンの更新 リンクのコピーリンクがクリップボードにコピーされました!
OidcClientRequestReactiveFilter、OidcClientRequestFilter、および Tokens プロデューサーは、更新トークンが利用可能な場合、現在の期限切れのアクセストークンを更新します。さらに、quarkus.oidc-client.refresh-token-time-skew プロパティーを使用して、アクセストークンをプリエンプティブに更新し、HTTP 401 エラーの原因となる可能性のある期限切れに近いアクセストークンの送信を回避することもできます。たとえば、このプロパティーが 3S に設定され、アクセストークンの有効期限が 3 秒未満の場合、このトークンは自動的に更新されます。
アクセストークンを更新する必要があるが、更新トークンが利用できない場合は、client_credentials などの設定された許可を使用して新しいトークンを取得しようとします。
一部の OpenID Connect プロバイダーは、client_credentials グラントのレスポンスでリフレッシュトークンを返しません。たとえば、Keycloak 12 以降では、client_credentials に対して更新トークンがデフォルトで返されなくなります。プロバイダーは、更新トークンの使用回数を制限する場合もあります。
1.1.11. アクセストークンの取り消し リンクのコピーリンクがクリップボードにコピーされました!
Keycloak などの OpenId Connect プロバイダーがトークン失効エンドポイントをサポートしている場合は、OidcClient#revokeAccessToken を使用して現在のアクセストークンを取り消すことができます。失効エンドポイント URL は、トークン要求 URI と一緒に検出されるか、quarkus.oidc-client.revoke-path を使用して設定できます。
このトークンを REST クライアントで使用すると HTTP 401 ステータスコードで失敗した場合、またはアクセストークンがすでに長期間使用されていて更新したい場合は、アクセストークンの取り消しが必要になる場合があります。
これは、更新トークンを使用して、トークンの更新をリクエストすることによって実現できます。ただし、更新トークンが利用できない場合は、まず更新トークンを取り消してから新しいアクセストークンを要求することで更新できます。
1.1.12. OidcClient 認証 リンクのコピーリンクがクリップボードにコピーされました!
OidcClient は、client_credentials およびその他の許可要求が成功するために、OpenID Connect Provider に対して認証する必要があります。すべての OIDC クライアント認証 オプションがサポートされています。以下に例を示します。
client_secret_basic:
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.secret=mysecret
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.secret=mysecret
または
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.client-secret.value=mysecret
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.client-secret.value=mysecret
または、CredentialsProvider から取得したシークレットを使用します。
client_secret_post:
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.client-secret.value=mysecret quarkus.oidc-client.credentials.client-secret.method=post
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.client-secret.value=mysecret
quarkus.oidc-client.credentials.client-secret.method=post
client_secret_jwt: 署名アルゴリズムは HS256 です。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
または、CredentialsProvider から取得したシークレットの場合、署名アルゴリズムは HS256 です。
PEM キーが application.properties にインライン化され、署名アルゴリズムが RS256 である private_key_jwt:
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.jwt.key=Base64-encoded private key representation
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key=Base64-encoded private key representation
PEM キーファイルを使用した private_key_jwt: 署名アルゴリズムは RS256 です。
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/ quarkus.oidc-client.client-id=quarkus-app quarkus.oidc-client.credentials.jwt.key-file=privateKey.pem
quarkus.oidc-client.auth-server-url=http://localhost:8180/auth/realms/quarkus/
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.key-file=privateKey.pem
キーストアファイルを含む private_key_jwt: 署名アルゴリズムは RS256 です。
client_secret_jwt または private_key_jwt 認証方法を使用すると、クライアントシークレットがネットワーク上に送信されなくなります。
1.1.12.1. 追加の JWT 認証オプション リンクのコピーリンクがクリップボードにコピーされました!
client_secret_jwt または private_key_jwt のいずれかの認証方法を使用する場合は、JWT 署名アルゴリズム、キー識別子、audience、サブジェクト、発行者をカスタマイズできます。次に例を示します。
1.1.12.2. JWT ベアラー リンクのコピーリンクがクリップボードにコピーされました!
RFC7523 では、JWT ベアラートークンを使用してクライアントを認証する方法を説明しています。詳細は、Using JWTs for Client Authentication セクションを参照してください。
有効にするには、以下を実行します。
quarkus.oidc-client.auth-server-url=${auth-server-url}
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.source=bearer
quarkus.oidc-client.auth-server-url=${auth-server-url}
quarkus.oidc-client.client-id=quarkus-app
quarkus.oidc-client.credentials.jwt.source=bearer
次に、JWT ベアラートークンを OIDC クライアントに client_assertion パラメーターとして提供する必要があります。
Quarkus はファイルシステムから JWT ベアラートークンをロードすることができます。たとえば、Kubernetes では、サービスアカウントトークンのプロジェクションを /var/run/secrets/tokens パスにマウントできます。後は JWT ベアラートークンパスを次のように設定するだけです。
quarkus.oidc-client.credentials.jwt.token-path=/var/run/secrets/tokens
quarkus.oidc-client.credentials.jwt.token-path=/var/run/secrets/tokens
- 1
- JWT ベアラートークンへのパス。Quarkus はファイルシステムから新しいトークンをロードします。トークンの有効期限が切れるとそれを再ロードします。
他の選択肢としては、追加のグラントパラメーターを受け入れるトークンを取得または更新するための OidcClient メソッド (例: oidcClient.getTokens(Map.of("client_assertion", "ey…"))) 使用する方法があります。
OIDC クライアントフィルターを使用する場合は、このアサーションを提供するカスタムフィルターを登録する必要があります。
以下は、Quarkus REST (旧称 RESTEasy Reactive) カスタムフィルターの例です。
以下は、RESTEasy Classic カスタムフィルターの例です。
1.1.12.3. Apple POST JWT リンクのコピーリンクがクリップボードにコピーされました!
Apple OpenID Connect プロバイダーは client_secret_post メソッドを使用します。ここで、シークレットは private_key_jwt 認証メソッドで生成された JWT ですが、Apple アカウント固有の発行者およびサブジェクトプロパティーを持ちます。
quarkus-oidc-client は非標準の client_secret_post_jwt 認証方式をサポートしており、次のように設定できます。
1.1.12.4. 相互 TLS リンクのコピーリンクがクリップボードにコピーされました!
一部の OpenID Connect Provider では、相互 TLS (mTLS) 認証プロセスの一部としてクライアントが認証されることが要求されます。
quarkus-oidc-client は、mTLS をサポートするために次のように設定できます。
1.1.13. OIDC Client SPI リンクのコピーリンクがクリップボードにコピーされました!
カスタムのエクステンションが、OIDC クライアントでサポートされているいずれかの OIDC トークングラントを使用して OIDC トークンを取得する必要がある場合、そのエクステンションで OIDC Client SPI を利用すれば、OIDC クライアント自体にアクセストークンを必要に応じて取得および更新させることができます。
次の依存関係を追加します。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-client-spi</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-client-spi</artifactId>
</dependency>
次に、必要に応じて io.quarkus.oidc.client.spi.TokenProvider CDI Bean を使用するようにエクステンションを更新します。次に例を示します。
現在、io.quarkus.oidc.client.spi.TokenProvider は、デフォルトの OIDC クライアントでのみ使用できます。カスタムエクステンションが複数の名前付き OIDC クライアントを認識することはほとんどないためです。
1.1.14. テスト リンクのコピーリンクがクリップボードにコピーされました!
まず、テストプロジェクトに次の依存関係を追加します。
1.1.14.1. Wiremock リンクのコピーリンクがクリップボードにコピーされました!
テストプロジェクトに次の依存関係を追加します。
Wiremock ベースの QuarkusTestResourceLifecycleManager を記述します。以下に例を示します。
REST テストエンドポイントを準備します。注入された MP REST クライアントと登録された OidcClient フィルターを使用するテストフロントエンドエンドポイントで、ダウンストリームエンドポイントを呼び出すことができます。このエンドポイントはトークンをエコーバックします。たとえば、main の Quarkus リポジトリーの integration-tests/oidc-client-wiremock を参照してください。
application.properties を設定します。以下に例を示します。
最後にテストコードを記述します。上記の Wiremock ベースのリソースを考えると、最初のテスト呼び出しは access_token_1 アクセストークンを返すはずですが、これは 4 秒後に期限切れになります。awaitility を使用して約 5 秒間待機すると、次のテスト呼び出しで access_token_2 アクセストークンが返され、期限切れの access_token_1 アクセストークンが更新されたことが確認されます。
1.1.14.2. Keycloak リンクのコピーリンクがクリップボードにコピーされました!
Keycloak を使用する場合は、Keycloak の OpenID Connect ベアラートークン結合テスト セクションで説明されているのと同じアプローチを使用できます。
1.1.15. ログ内のエラーを確認する方法 リンクのコピーリンクがクリップボードにコピーされました!
トークンの取得と更新エラーの詳細を確認するには、io.quarkus.oidc.client.runtime.OidcClientImpl TRACE レベルのログ記録を有効にします。
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".level=TRACE quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".min-level=TRACE
OidcClient 初期化エラーの詳細を表示するには、io.quarkus.oidc.client.runtime.OidcClientRecorder TRACE レベルのログ記録を有効にします。
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".level=TRACE quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".level=TRACE
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".min-level=TRACE
1.2. OIDC リクエストフィルター リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の OidcRequestFilter 実装を登録することで、OIDC クライアントから OIDC プロバイダーへの OIDC リクエストをフィルタリングできます。これにより、新しいリクエストヘッダーを更新または追加したり、リクエストボディーを分析したりすることができます。
1 つのフィルターですべての OIDC プロバイダーエンドポイントへのリクエストをインターセプトすることも、@OidcEndpoint アノテーションを使用してこのフィルターを特定のエンドポイントへのリクエストにのみ適用することもできます。以下に例を示します。
OidcRequestContextProperties を使用して、リクエストのプロパティーにアクセスできます。現在は、client_id キーを使用してクライアントテナント ID にアクセスできます。また、grant_type キーを使用して、OIDC クライアントがトークンを取得するために使用するグラントタイプにアクセスできます。
1.3. OIDC レスポンスフィルター リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の OidcResponseFilter 実装を登録することで、OIDC クライアントリクエストへのレスポンスをフィルタリングできます。これにより、ログへの記録やその他のアクションを実行するために、レスポンスのステータス、ヘッダー、ボディーを確認できます。
1 つのフィルターですべての OIDC クライアントリクエストへのレスポンスをインターセプトすることも、@OidcEndpoint アノテーションを使用して、このフィルターを特定の OIDC クライアントリクエストへのレスポンスにのみ適用することもできます。以下に例を示します。
1.4. Quarkus REST のトークン伝播 リンクのコピーリンクがクリップボードにコピーされました!
quarkus-rest-client-oidc-token-propagation エクステンションは、認証情報の伝播を簡素化する REST クライアントフィルター io.quarkus.oidc.token.propagation.reactive.AccessTokenRequestReactiveFilter を提供します。このクライアントは、現在アクティブなリクエストに存在する ベアラートークン、または 認可コードフローメカニズム から取得したトークンを、HTTP Authorization ヘッダーの Bearer スキーム値として伝播します。
io.quarkus.oidc.token.propagation.common.AccessToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider アノテーションのいずれかを使用して、AccessTokenRequestReactiveFilter を選択的に登録できます。次に例を示します。
または
さらに、AccessTokenRequestReactiveFilter は、トークンを伝播する前に交換する必要がある複雑なアプリケーションをサポートできます。
Keycloak または Token Exchange トークングラントをサポートする別の OIDC プロバイダーを使用する場合は、次のように AccessTokenRequestReactiveFilter を設定してトークンを交換できます。
- 1
- OidcClient 名が
io.quarkus.oidc.token.propagation.common.AccessToken#exchangeTokenClientアノテーション属性で設定されている場合、exchange-token設定プロパティーは無視されることに注意してください。
AccessTokenRequestReactiveFilter は OidcClient を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange を使用すると、OpenID Connect プロバイダーが要求する追加の交換プロパティーを設定できます。
現在のトークンを交換するために JWT ベアラートークングラント を 使用する必要がある Azure などのプロバイダーを使用する場合は、次のように AccessTokenRequestReactiveFilter を設定してトークンを交換できます。
AccessTokenRequestReactiveFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.rest-client-oidc-token-propagation.client-name 設定プロパティー、または io.quarkus.oidc.token.propagation.common.AccessToken#exchangeTokenClient アノテーション属性を使用して選択できます。
1.5. RESTEasy Classic のトークン伝播 リンクのコピーリンクがクリップボードにコピーされました!
quarkus-resteasy-client-oidc-token-propagation エクステンションは、認証情報の伝播を簡素化する 2 つの Jakarta REST jakarta.ws.rs.client.ClientRequestFilter クラス実装を提供します。io.quarkus.oidc.token.propagation.AccessTokenRequestFilter は、現在アクティブなリクエストに存在する ベアラートークン、または 認可コードフローメカニズム から取得されたトークンを、HTTP Authorization ヘッダーの Bearer スキーム値として伝播します。io.quarkus.oidc.token.propagation.JsonWebTokenRequestFilter は同じ機能を提供しますが、さらに JWT トークンのサポートも提供します。
現在の認可コードフローアクセストークンを伝播する必要がある場合は、即時トークン伝播が適切に機能します。これは、(ID トークンではなく) コードフローアクセストークンが、現在認証されているユーザーに代わってリモートサービスにアクセスするために現在の Quarkus エンドポイントに伝播されることを意図したものであるためです。
ただし、エンドツーエンドの Bearer トークンの直接的な伝播は回避する必要があります。たとえば、Client → Service A → Service B の場合、Service B は Client から Service A に送信されたトークンを受信します。このような場合、Service B はトークンが Service A から来たものか、Client から直接来たものか区別できません。トークンが Service A から送信されたことを Service B が確認するには、新しい発行者と audience クレームをアサートできる必要があります。
さらに、複雑なアプリケーションでは、トークンを伝播する前に交換または更新しないといけない場合があります。たとえば、Service A が Service B にアクセスする場合、アクセスコンテキストが異なる場合があります。この場合、Service A には、Service B にアクセスするための狭い範囲またはまったく異なる範囲のセットが付与される可能性があります。
次のセクションでは、AccessTokenRequestFilter と JsonWebTokenRequestFilter がどのように役立つかを示します。
1.5.1. RestClient AccessTokenRequestFilter リンクのコピーリンクがクリップボードにコピーされました!
AccessTokenRequestFilter はすべてのトークンを文字列として扱うため、JWT トークンと不透明トークンの両方で動作します。
io.quarkus.oidc.token.propagation.common.AccessToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、AccessTokenRequestFilter を選択的に登録できます。次に例を示します。
または
または、quarkus.resteasy-client-oidc-token-propagation.register-filter プロパティーが true に設定され、quarkus.resteasy-client-oidc-token-propagation.json-web-token プロパティーが false (デフォルト値) に設定されている場合、AccessTokenRequestFilter はすべての MP Rest または Jakarta REST クライアントに自動的に登録されます。
1.5.1.1. 伝播前のトークンの交換 リンクのコピーリンクがクリップボードにコピーされました!
現在のアクセストークンを伝播前に交換する必要があり、Token Exchange トークングラントをサポートする Keycloak またはその他の OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を次のように設定できます。
現在のトークンを交換するために JWT ベアラートークングラント を 使用する必要がある Azure などのプロバイダーを使用する場合は、次のように AccessTokenRequestFilter を設定してトークンを交換できます。
AccessTokenRequestFilter は OidcClient を使用して現在のトークンを交換します。quarkus.oidc-client.grant-options.exchange を使用して、OpenID Connect プロバイダーが要求する追加の交換プロパティーを設定できます。
AccessTokenRequestFilter はデフォルトの OidcClient を使用します。名前付きの OidcClient は、quarkus.resteasy-client-oidc-token-propagation.client-name 設定プロパティーを使用して選択できます。
1.5.2. RestClient JsonWebTokenRequestFilter リンクのコピーリンクがクリップボードにコピーされました!
Bearer JWT トークンを使用する場合、issuer や audience などのトークンのクレームを変更したり、更新されたトークンを再度保護 (再署名など) したりできる場合は、JsonWebTokenRequestFilter を使用することを推奨します。注入された org.eclipse.microprofile.jwt.JsonWebToken が想定されるため、不透明なトークンでは機能しません。また、OpenID Connect Provider が Token Exchange プロトコルをサポートしている場合は、代わりに AccessTokenRequestFilter を使用することを推奨します。AccessTokenRequestFilter を使用すると、JWT と不透明ベアラートークンの両方を安全に交換できるためです。
JsonWebTokenRequestFilter を使用すると、Service A の実装で、注入された org.eclipse.microprofile.jwt.JsonWebToken を新しい issuer と audience のクレーム値で簡単に更新し、更新されたトークンを新しい署名で再度保護できるようになります。唯一の難しいステップは、Service A に署名鍵があることを確認することです。この署名鍵は、セキュアなファイルシステムまたは Vault などのリモートのセキュアなストレージからプロビジョニングする必要があります。
io.quarkus.oidc.token.propagation.JsonWebToken または org.eclipse.microprofile.rest.client.annotation.RegisterProvider のいずれかを使用して、JsonWebTokenRequestFilter を選択的に登録できます。次に例を示します。
または
または、quarkus.resteasy-client-oidc-token-propagation.register-filter プロパティーと quarkus.resteasy-client-oidc-token-propagation.json-web-token プロパティーの両方が true に設定されている場合、JsonWebTokenRequestFilter はすべての MicroProfile REST または Jakarta REST クライアントに自動的に登録できます。
1.5.2.1. 伝播前のトークンの更新 リンクのコピーリンクがクリップボードにコピーされました!
注入されたトークンの iss (issuer) または aud (audience) クレームを更新し、新しい署名で再度保護する必要がある場合は、次のように JsonWebTokenRequestFilter を設定できます。
前述のように、Keycloak または Token Exchange プロトコルをサポートする OpenID Connect Provider を使用する場合は、AccessTokenRequestFilter を使用します。
1.5.3. テスト リンクのコピーリンクがクリップボードにコピーされました!
通常、2 つの REST テストエンドポイントを準備する必要があります。最初のエンドポイントは、登録済みのトークン伝播フィルターを備えた注入された MP REST クライアントを使用して、2 番目のエンドポイントを呼び出します。
これを実行する方法は、OpenID Connect クライアントとトークンの伝播 クイックスタート、特に テスト セクションを参照してください。
1.6. 設定の参照 リンクのコピーリンクがクリップボードにコピーされました!
1.6.1. OIDC クライアント リンクのコピーリンクがクリップボードにコピーされました!
🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。
| 設定プロパティー | 型 | デフォルト |
|
🔒 ビルド時に固定 OIDC クライアントエクステンションを有効にするかどうか。
環境変数: | boolean |
|
|
OpenID Connect (OIDC) サーバーのベース URL (例:
環境変数: | string | |
|
OIDC エンドポイントの検出。有効になっていない場合は、OIDC エンドポイント URL を個別に設定する必要があります。
環境変数: | boolean |
|
|
OIDC 動的クライアント登録エンドポイントの相対パスまたは絶対 URL。
環境変数: | string | |
|
OIDC サーバーへの初期接続を試行する期間。たとえば、期間を
環境変数: | ||
|
既存の OIDC 接続が一時的に失われた場合に、再確立を再試行する回数。最初の接続試行にのみ適用される
環境変数: | int |
|
|
現在の OIDC 接続リクエストがタイムアウトするまでの秒数。
環境変数: |
| |
|
DNS ルックアップをワーカースレッドで実行するかどうか。このオプションは、OIDC サーバーへの HTTP リクエストによってブロックされた Vert.x イベントループに関するログに記録された警告を確認できる場合に使用してください。
環境変数: | boolean |
|
|
WebClient が使用する接続プールの最大サイズ。
環境変数: | int | |
|
WebClient が HTTP 302 を取得すると、リダイレクトを自動的に実行します。このプロパティーが無効な場合、リダイレクト要求時に 1 つ以上の Cookie が設定されている場合にのみ、まったく同じ元の URI へのリダイレクトが 1 回だけ許可されます。
環境変数: | boolean |
|
|
アクセストークンとリフレッシュトークンを発行する OIDC トークンエンドポイント。相対パスまたは絶対 URL として指定されます。
環境変数: | string | |
|
OIDC トークン失効エンドポイントの相対パスまたは絶対 URL。
環境変数: | string | |
|
アプリケーションのクライアント ID各アプリケーションには、アプリケーションを識別するために使用されるクライアント ID があります。
環境変数: | string | |
|
アプリケーションのクライアント名。これは、アプリケーション (クライアント) が OpenId Connect プロバイダーのダッシュボードに登録されるときに提供できる、人間が判読できる形式のアプリケーションの説明を示すことを目的としています。たとえば、このプロパティーを設定すると、特定のクライアントのアクティビティーを記録した、より有益なログメッセージを取得できます。
環境変数: | string | |
|
一意の OIDC クライアント識別子。OIDC クライアントが動的に作成される場合は設定する必要があります。そうでない場合は任意です。
環境変数: | string | |
|
このクライアント設定を有効にするかどうか。
環境変数: | boolean |
|
|
アクセストークンのスコープのリスト
環境変数: | list of string | |
|
リフレッシュトークンの時間のずれ。このプロパティーを有効にすると、アクセストークンを更新する必要があるかどうかを確認するときに、設定した期間が秒数に変換され、現在の時刻に追加されます。合計がこのアクセストークンの有効期限よりも大きい場合は、更新が行われます。
環境変数: | ||
|
現在の時刻を基準としたアクセストークンの有効期限。このプロパティーは、アクセストークングラントのレスポンスにアクセストークンの有効期限プロパティーが含まれていない場合にのみチェックされます。
環境変数: | ||
|
計算されたトークン有効期限に追加できるアクセストークン有効期限のずれ。
環境変数: | ||
|
アクセストークンの 'expires_in' プロパティーを、現在の時刻に対する相対的な期間ではなく、絶対的な時間値としてチェックするかどうか。
環境変数: | boolean |
|
|
グラントタイプ
環境変数: | client: 'client_credentials' グラント。これは、OIDC クライアント認証だけを必要とします。 password: 'password' グラント。これは、OIDC クライアント認証とユーザー ('username' と 'password') 認証の両方を必要とします。 code: 'authorization_code' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'code' および 'redirect_uri' パラメーターを少なくとも必要とします。 exchange: 'urn:ietf:params:oauth:grant-type:token-exchange' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'subject_token' パラメーターを少なくとも必要とします。 jwt: 'urn:ietf:params:oauth:grant-type:jwt-bearer' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'assertion' パラメーターを少なくとも必要とします。
refresh: 'refresh_token' グラント。これは、OIDC クライアント認証とリフレッシュトークンを必要とします。なお、アクセストークン取得レスポンスにリフレッシュトークンが含まれている場合、OidcClient はデフォルトでこのグラントをサポートします。ただし、場合によっては、リフレッシュトークンが帯域外で提供されることもあります。たとえば、リフレッシュトークンが複数の機密クライアントのサービス間で共有されることがあります。'quarkus.oidc-client.grant-type' が 'refresh' に設定されている場合、 ciba: 'urn:openid:params:grant-type:ciba' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'auth_req_id' パラメーターを必要とします。 device: 'urn:ietf:params:oauth:grant-type:device_code' グラント。これは、OIDC クライアント認証と、トークンリクエスト時に OidcClient に渡す必要がある 'device_code' パラメーターを必要とします。 | client |
|
トークングラントレスポンス内のアクセストークンプロパティー名
環境変数: | string |
|
|
トークングラントレスポンス内のトークンプロパティー名の更新
環境変数: | string |
|
|
トークングラントレスポンス内のアクセストークンの有効期限プロパティー名
環境変数: | string |
|
|
トークングラントレスポンス内のトークン有効期限プロパティー名の更新
環境変数: | string |
|
|
グラントオプション
環境変数: | Map<String,Map<String,String>> | |
|
'OidcClient' を使用するすべてのフィルターが、構築後の初期化時にトークンを取得することを必須にします。この初期化は、これらのトークンが使用されるはるか前に行われる可能性があります。アクセストークンが初めて使用される前に期限切れになる可能性があり、リフレッシュトークンが利用できない場合は、このプロパティーを無効にする必要があります。
環境変数: | boolean |
|
|
トークンエンドポイントに送信する必要があるカスタム HTTP ヘッダー
環境変数: | Map<String,String> | |
| 型 | デフォルト | |
|
プロキシーのホスト名または IP アドレス。
環境変数: | string | |
|
プロキシーのポート番号。デフォルト値は
環境変数: | int |
|
|
プロキシーに認証が必要な場合のユーザー名。
環境変数: | string | |
|
プロキシーに認証が必要な場合のパスワード。
環境変数: | string | |
| 型 | デフォルト | |
|
使用する TLS 設定の名前。
名前が設定されている場合は、 デフォルトの TLS 設定はデフォルトでは 使用されません。
環境変数: | string | |
| OIDC クライアントが OIDC トークンやその他の保護されたエンドポイントにアクセスするためのさまざまな認証オプション | 型 | デフォルト |
|
環境変数: | string | |
|
クライアントシークレットの値。
環境変数: | string | |
|
CredentialsProvider Bean 名。複数の CredentialsProvider が登録されている場合にのみ設定する必要があります。
環境変数: | string | |
|
CredentialsProvider のキーリング名。キーリング名は、使用されている CredentialsProvider がシークレットを検索するためにキーリング名を必要とする場合にのみ必要です。これは、vault インスタンスやシークレットマネージャーなど、より動的なソースから認証情報を取得するために、CredentialsProvider が複数のエクステンションによって共有される場合によく発生します。
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
認証方法。
環境変数: |
basic:
post:
post-jwt: query: クライアント ID とシークレットが、HTTP クエリーパラメーターとして送信されます。このオプションは OIDC エクステンションでのみサポートされます。 | |
|
JWT トークンソース: OIDC プロバイダークライアントまたは既存の JWT ベアラートークン。
環境変数: |
client: JWT トークンが、 bearer: JWT ベアラートークンがクライアントアサーションとして使用されます (https://www.rfc-editor.org/rfc/rfc7523#section-2.2)。 | client |
|
クライアントアサーションとして使用する必要がある JWT ベアラートークンを含むファイルへのパス。このパスは、JWT ソース (
環境変数: | path | |
|
指定されている場合、JWT がシークレットキーを使用して署名されていることを示します。これは、
環境変数: | string | |
|
CredentialsProvider Bean 名。複数の CredentialsProvider が登録されている場合にのみ設定する必要があります。
環境変数: | string | |
|
CredentialsProvider のキーリング名。キーリング名は、使用されている CredentialsProvider がシークレットを検索するためにキーリング名を必要とする場合にのみ必要です。これは、vault インスタンスやシークレットマネージャーなど、より動的なソースから認証情報を取得するために、CredentialsProvider が複数のエクステンションによって共有される場合によく発生します。
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
秘密鍵の文字列表現。指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。これは、
環境変数: | string | |
|
指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。これは、
環境変数: | string | |
|
指定されている場合、JWT はキーストアの秘密鍵を使用して署名されていることを示します。これは、
環境変数: | string | |
|
キーストアファイルのパスワードを指定するためのパラメーター。
環境変数: | string | |
|
秘密鍵の ID またはエイリアス。
環境変数: | string | |
|
秘密鍵のパスワード。
環境変数: | string | |
|
JWT オーディエンス (
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
追加のクレーム。
環境変数: | Map<String,String> | |
|
環境変数: | string | |
|
JWT の有効期間 (秒単位)。この値は、JWT が発行された時刻に追加され、有効期限を計算します。
環境変数: | int |
|
|
true の場合、クライアント認証トークンは JWT ベアラーグラントアサーションです。'client_assertion' および 'client_assertion_type' フォームプロパティーを生成する代わりに、'assertion' のみが生成されます。このオプションは、OIDC クライアントエクステンションでのみサポートされます。
環境変数: | boolean |
|
duration の値を書き込むには、標準の java.time.Duration フォーマットを使用します。詳細は、Duration#parse() Java API ドキュメント を参照してください。
数字で始まる簡略化されたフォーマットも使用できます。
- 値が数値のみの場合は、秒単位の時間を表します。
-
数字の後に
msが続く値は、ミリ秒単位の時間を表します。
その他の場合は、解析のために簡略化されたフォーマットが java.time.Duration フォーマットに変換されます。
-
数字の後に
h、m、またはsが続く値には、接頭辞PTが付きます。 -
数字の後に
dが続く値は、接頭辞Pが付きます。
1.6.2. OIDC トークンの伝播 リンクのコピーリンクがクリップボードにコピーされました!
🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。
| 設定プロパティー | 型 | デフォルト |
|
🔒 ビルド時に固定 OIDC トークンリアクティブプロパゲーションを有効にするかどうか。
環境変数: | boolean |
|
|
🔒 ビルド時に固定
たとえば、 この機能は複製されたコンテキストに依存することに注意してください。Vert.x の複製されたコンテキストの詳細は、こちらのガイド を参照してください。
環境変数: | boolean |
|
|
🔒 ビルド時に固定 トークンを伝播する前に、"urn:ietf:params:oauth:grant-type:token-exchange" または "urn:ietf:params:oauth:grant-type:jwt-bearer" トークングラントのいずれかを使用して、OpenId Connect プロバイダーで現在のトークンを新しいトークンと交換します。
環境変数: | boolean |
|
|
🔒 ビルド時に固定
設定された OidcClient の名前。このプロパティーは、
環境変数: | string |
1.7. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第2章 OpenID Connect クライアントとトークンの伝播クイックスタート リンクのコピーリンクがクリップボードにコピーされました!
フィルター付きの OpenID Connect (OIDC) および OAuth2 クライアントを使用して、アプリケーションでアクセストークンを取得、更新、および伝播する方法を学習します。
Quarkus での OIDC Client と Token Propagation のサポートの詳細は、OpenID Connect (OIDC) と OAuth2 クライアントおよびフィルターのリファレンスガイド を参照してください。
ベアラートークン認可を使用してアプリケーションを保護するには、OpenID Connect (OIDC) ベアラートークン認証 ガイドを参照してください。
2.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAVA_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.8.6 以降
- 動作するコンテナーランタイム (Docker または Podman)
- オプション: Quarkus CLI (使用する場合)
- オプション: ネイティブ実行可能ファイルをビルドする場合は、インストールおよび 適切に設定された Mandrel または GraalVM (ネイティブコンテナービルドを使用する場合は Docker)。
- jq tool
2.2. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
この例では、FrontendResource と ProtectedResource という 2 つの Jakarta REST リソースを使用してアプリケーションがビルドされます。ここで、FrontendResource は、以下に示す 3 つの方法のいずれかを使用してアクセストークンを ProtectedResource に伝播します。
- トークンを伝播する前に、OIDC クライアントフィルターを使用してトークンを取得できます。
-
プログラムで作成された OIDC クライアントを使用してトークンを取得し、それを HTTP
Authorizationヘッダー値として REST クライアントメソッドに渡すことで伝播できます。 - OIDC トークン伝播フィルターを使用して、受信したアクセストークンを伝播できます。
FrontendResource には 8 つのエンドポイントがあります。
-
/frontend/user-name-with-oidc-client-token -
/frontend/admin-name-with-oidc-client-token -
/frontend/user-name-with-oidc-client-token-header-param -
/frontend/admin-name-with-oidc-client-token-header-param -
/frontend/user-name-with-oidc-client-token-header-param-blocking -
/frontend/admin-name-with-oidc-client-token-header-param-blocking -
/frontend/user-name-with-propagated-token -
/frontend/admin-name-with-propagated-token
/frontend/user-name-with-oidc-client-token または /frontend/admin-name-with-oidc-client-token エンドポイントのいずれかが呼び出されると、FrontendResource は REST クライアントと OIDC クライアントフィルターを使用してアクセストークンを取得し、ProtectedResource に伝播します。/frontend/user-name-with-oidc-client-token-header-param または /frontend/admin-name-with-oidc-client-token-header-param エンドポイントのいずれかが呼び出されると、FrontendResource はプログラムで作成された OIDC クライアントを使用してアクセストークンを取得し、それを HTTP Authorization ヘッダー値として REST クライアントメソッドに渡すことで ProtectedResource に伝播します。/frontend/user-name-with-propagated-token または /frontend/admin-name-with-propagated-token エンドポイントのいずれかが呼び出されると、FrontendResource は REST クライアントと OIDC Token Propagation Filter を使用して、現在の受信アクセストークンを ProtectedResource に伝播します。
ProtectedResource には 2 つのエンドポイントがあります。
-
/protected/user-name -
/protected/admin-name
両方のエンドポイントは、FrontendResource から ProtectedResource に伝播された受信アクセストークンから抽出されたユーザー名を返します。これらのエンドポイントの唯一の違いは、/protected/user-name の呼び出しは現在のアクセストークンに user ロールがある場合にのみ許可され、/protected/admin-name の呼び出しは現在のアクセストークンに admin ロールがある場合にのみ許可されることです。
2.3. ソリューション リンクのコピーリンクがクリップボードにコピーされました!
次のセクションの指示に従って、アプリケーションを段階的に作成することを推奨します。ただし、完成した例に直接進むこともできます。
Git リポジトリーのクローンを作成するか (git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.20)、アーカイブ をダウンロードしてください。
ソリューションは、security-openid-connect-client-quickstart ディレクトリー にあります。
2.4. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
まず、新しいプロジェクトが必要です。次のコマンドで新しいプロジェクトを作成します。
Quarkus CLI を使用する場合:
quarkus create app org.acme:security-openid-connect-client-quickstart \ --extension='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest' \ --no-code cd security-openid-connect-client-quickstartquarkus create app org.acme:security-openid-connect-client-quickstart \ --extension='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest' \ --no-code cd security-openid-connect-client-quickstartCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle プロジェクトを作成するには、
--gradleオプションまたは--gradle-kotlin-dslオプションを追加します。Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。
Maven を使用する場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle プロジェクトを作成するには、
-DbuildTool=gradleまたは-DbuildTool=gradle-kotlin-dslオプションを追加します。
Windows ユーザーの場合:
-
cmd を使用する場合は、バックスラッシュ
\を使用せず、すべてを同じ行に記述してください。 -
Powershell を使用する場合は、
-Dパラメーターを二重引用符で囲みます (例:"-DprojectArtifactId=security-openid-connect-client-quickstart")。
Maven プロジェクトが生成され、oidc、rest-client-oidc-filter、rest-client-oidc-token-propagation、および rest エクステンションがインポートされます。
Quarkus プロジェクトがすでに設定されている場合は、プロジェクトベースディレクトリーで次のコマンドを実行して、これらのエクステンションをプロジェクトに追加できます。
Quarkus CLI を使用する場合:
quarkus extension add oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest
quarkus extension add oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,restCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw quarkus:add-extension -Dextensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'
./mvnw quarkus:add-extension -Dextensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew addExtension --extensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'
./gradlew addExtension --extensions='oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ビルドファイルに次のエクステンションが追加されます。
Maven を使用する場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
implementation("io.quarkus:quarkus-oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest")implementation("io.quarkus:quarkus-oidc,rest-client-oidc-filter,rest-client-oidc-token-propagation,rest")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5. アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
まず、ProtectedResource を実装します。
ProtectedResource は、userName() メソッドと adminName() メソッドの両方から名前を返します。名前は現在の JsonWebToken から展開されます。
次に、以下の REST クライアントを追加します。
-
RestClientWithOidcClientFilter: これは、quarkus-rest-client-oidc-filterエクステンションによって提供される OIDC クライアントフィルターを使用して、アクセストークンを取得および伝播します。 -
RestClientWithTokenHeaderParam: これは、プログラムで作成された OidcClient によってすでに取得されたトークンを HTTPAuthorizationヘッダー値として受け入れます。 -
RestClientWithTokenPropagationFilter: これは、quarkus-rest-client-oidc-token-propagationエクステンションによって提供される OIDC トークン伝播フィルターを使用して、アクセストークンを取得および伝播します。
RestClientWithOidcClientFilter REST クライアントを追加します。
- 1
- REST クライアントに OIDC クライアントフィルターを登録して、トークンを取得および伝播します。
RestClientWithTokenHeaderParam REST クライアントを追加します。
RestClientWithTokenPropagationFilter REST クライアントを追加します。
- 1
- REST クライアントに OIDC トークン伝播フィルターを登録して、既存の受信トークンを伝播します。
RestClientWithOidcClientFilter インターフェイスと RestClientWithTokenPropagationFilter インターフェイスを同じ REST クライアントで使用しないでください。競合が発生し、問題が発生する可能性があります。たとえば、OIDC クライアントフィルターが、OIDC トークン伝播フィルターからのトークンをオーバーライドすることがあります。また、利用可能なトークンがない場合に伝播フィルターがトークンを伝播しようとしても、代わりに OIDC クライアントフィルターに新しいトークンを取得するよう要求して、伝播フィルターが正しく機能しない可能性があります。
また、起動時にプログラムで OIDC クライアントを作成するには、OidcClientCreator を追加します。OidcClientCreator は RestClientWithTokenHeaderParam REST クライアント呼び出しをサポートしています。
- 1
OidcClientsを使用して、すでに初期化され、名前が付けられた OIDC クライアントを取得できるほか、必要に応じて新しい OIDC クライアントを作成できます。
次に、FrontendResource を追加してアプリケーションの作成を完了します。
- 1 5 6
FrontendResourceは、/frontend/user-name-with-oidc-client-tokenまたは/frontend/admin-name-with-oidc-client-tokenのいずれかが呼び出されたときに、注入されたRestClientWithOidcClientFilterREST クライアントと OIDC クライアントフィルターを使用し、アクセストークンを取得してProtectedResourceに伝播します。- 2 7 8
FrontendResourceは、/frontend/user-name-with-propagated-tokenまたは/frontend/admin-name-with-propagated-tokenのいずれかが呼び出されたときに、注入されたRestClientWithTokenPropagationFilterREST クライアントと OIDC トークン伝播フィルターを使用して、現在の受信アクセストークンをProtectedResourceに伝播します。- 4 9 10
FrontendResourceは、/frontend/user-name-with-oidc-client-token-header-paramまたは/frontend/admin-name-with-oidc-client-token-header-paramのいずれかが呼び出されたときに、プログラムで作成された OIDC クライアントを使用してアクセストークンを取得し、注入されたRestClientWithTokenHeaderParamREST クライアントのメソッドに HTTPAuthorizationヘッダー値として直接アクセストークンを渡すことでProtectedResourceに伝播します。- 11 12
- 場合によっては、REST クライアントでトークンを伝播する前に、ブロッキング方式でトークンを取得する必要があることがあります。この例では、そのような場合にトークンを取得する方法を示しています。
- 3
io.quarkus.oidc.client.runtime.TokensHelperは、OIDC クライアントフィルターを使用せずに OIDC クライアントを直接使用する場合に便利なツールです。TokensHelperを使用するには、OIDC クライアントを渡してトークンを取得します。TokensHelperは、トークンを取得し、必要に応じてスレッドセーフな方法でトークンを更新します。
最後に、Jakarta REST ExceptionMapper を追加します。
この例外マッパーは、トークンに予期されるロールがない場合に ProtectedResource が 403 を返すことをテスト中に検証するためにのみ追加されます。このマッパーがない場合、Quarkus REST (旧称 RESTEasy Reactive) は、REST クライアント呼び出しから逃れた例外を 500 に正しく変換し、ProtectedResource など、ダウンストリームリソースからの情報の漏洩を回避します。ただし、テストでは、500 が何らかの内部エラーではなく、認可例外によって発生したと断言することはできません。
2.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
コードを準備したら、アプリケーションを設定します。
上記の設定は Keycloak を参照します。Keycloak は、ProtectedResource によって受信アクセストークンを検証するために使用され、OidcClient によって password グラントを使用してユーザー alice のトークンを取得するために使用されます。両方の REST クライアントは ProtectedResource の HTTP アドレスを参照します。
quarkus.oidc.auth-server-url に %prod. プロファイル接頭辞を追加すると、アプリケーションが開発モードまたはテストモードで実行されるときに、Dev Services for Keycloak によってコンテナーが起動されるようになります。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。
2.7. Keycloak サーバーの起動と設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを開発モードまたはテストモードで実行するときは、Keycloak サーバーを起動しないでください。Dev Services for Keycloak がコンテナーを起動します。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。レルム設定ファイル を target/classes ディレクトリーのクラスパスに配置するようにしてください。この配置により、ファイルが開発モードで自動的にインポートされるようになります。ただし、すでに 完全なソリューション をビルドしている場合は、レルムファイルをクラスパスに追加する必要はありません。ビルドプロセスですでに追加されているためです。
Docker を使用して次のコマンドを実行するだけで、Keycloak サーバーを起動できます。
docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
docker run --name keycloak -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
{keycloak.version} は 26.1.3 以降に設定します。
Keycloak サーバーには localhost:8180 からアクセスできます。
Keycloak 管理コンソールにアクセスするには、admin ユーザーとしてログインします。パスワードは admin です。
新しいレルムを作成するには、レルム設定ファイル をインポートします。詳細は、新しいレルムを作成する 方法に関する Keycloak のドキュメントを参照してください。
この quarkus レルムファイルは、frontend クライアントと、alice および admin ユーザーを追加します。alice には user ロールがあります。admin には user と admin の両方のロールがあります。
2.8. 開発モードでのアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションを実行するには、次を使用します。
Quarkus CLI を使用する場合:
quarkus dev
quarkus devCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw quarkus:dev
./mvnw quarkus:devCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew --console=plain quarkusDev
./gradlew --console=plain quarkusDevCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Dev Services for Keycloak が Keycloak コンテナーを起動し、quarkus-realm.json をインポートします。
/q/dev-ui で利用可能な Dev UI を開き、OpenID Connect Dev UI カードの Keycloak provider リンクをクリックします。
求められたら、OpenID Connect Dev UI によって提供される Single Page Application にログインします。
パスワード
adminを使用して、adminとしてログインします。このユーザーにはadminとuserの両方のロールがあります。-
/frontend/user-name-with-propagated-tokenにアクセスすると、200が返されます。 -
/frontend/admin-name-with-propagated-tokenにアクセスすると、200が返されます。
-
ログアウトし、パスワード
aliceを使用してaliceとして再度ログインします。このユーザーにはuserロールがあります。-
/frontend/user-name-with-propagated-tokenにアクセスすると、200が返されます。 -
/frontend/admin-name-with-propagated-tokenにアクセスすると、403が返されます。
-
これで、FrontendResource が OpenID Connect Dev UI からアクセストークンを伝播できることをテストできました。
2.9. JVM モードでのアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションを試した後、標準の Java アプリケーションとして実行できます。
まず、コンパイルします。
Quarkus CLI を使用する場合:
quarkus build
quarkus buildCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw install
./mvnw installCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew build
./gradlew buildCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次に、実行します。
java -jar target/quarkus-app/quarkus-run.jar
java -jar target/quarkus-app/quarkus-run.jar
2.10. ネイティブモードでアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
このデモはネイティブコードにコンパイルできます。変更は必要ありません。
これは、生成されたバイナリーにランタイムテクノロジーが含まれ、最小限のリソースで実行するように最適化されているため、実稼働環境に JVM をインストールする必要がなくなることを意味します。
コンパイルには時間がかかるため、この手順はデフォルトでオフになっています。再度ビルドするには、native プロファイルを有効にします。
Quarkus CLI を使用する場合:
quarkus build --native
quarkus build --nativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw install -Dnative
./mvnw install -DnativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew build -Dquarkus.native.enabled=true
./gradlew build -Dquarkus.native.enabled=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow
しばらくしてビルドが完了すると、ネイティブバイナリーを直接実行できます。
./target/security-openid-connect-quickstart-1.0.0-SNAPSHOT-runner
./target/security-openid-connect-quickstart-1.0.0-SNAPSHOT-runner
2.11. アプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションをテストする方法の詳細は、前述の 開発モードでのアプリケーションの実行 セクションを参照してください。
curl を使用して、JVM モードまたはネイティブモードで起動されたアプリケーションをテストできます。
alice のアクセストークンを取得します。
このトークンを使用して、/frontend/user-name-with-propagated-token を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。
curl -i -X GET \ http://localhost:8080/frontend/user-name-with-propagated-token \ -H "Authorization: Bearer "$access_token
curl -i -X GET \
http://localhost:8080/frontend/user-name-with-propagated-token \
-H "Authorization: Bearer "$access_token
同じトークンを使用して、/frontend/admin-name-with-propagated-token を呼び出します。前のコマンドとは対照的に、このコマンドは 403 を返します。alice に付与されているのは user ロールだけであるためです。
curl -i -X GET \ http://localhost:8080/frontend/admin-name-with-propagated-token \ -H "Authorization: Bearer "$access_token
curl -i -X GET \
http://localhost:8080/frontend/admin-name-with-propagated-token \
-H "Authorization: Bearer "$access_token
次に、admin のアクセストークンを取得します。
このトークンを使用して、/frontend/user-name-with-propagated-token を呼び出します。このコマンドは、ステータスコード 200 と名前 admin を返します。
curl -i -X GET \ http://localhost:8080/frontend/user-name-with-propagated-token \ -H "Authorization: Bearer "$access_token
curl -i -X GET \
http://localhost:8080/frontend/user-name-with-propagated-token \
-H "Authorization: Bearer "$access_token
同じトークンを使用して、/frontend/admin-name-with-propagated-token を呼び出します。admin には user と admin の両方のロールがあるため、このコマンドも 200 ステータスコードと名前 admin を返します。
curl -i -X GET \ http://localhost:8080/frontend/admin-name-with-propagated-token \ -H "Authorization: Bearer "$access_token
curl -i -X GET \
http://localhost:8080/frontend/admin-name-with-propagated-token \
-H "Authorization: Bearer "$access_token
次に、既存のトークンを伝播せず、OidcClient を使用してトークンを取得および伝播する FrontendResource メソッドを確認します。すでに示したように、OidcClient はユーザー alice のトークンを取得するように設定されています。
curl -i -X GET \ http://localhost:8080/frontend/user-name-with-oidc-client-token
curl -i -X GET \
http://localhost:8080/frontend/user-name-with-oidc-client-token
このコマンドは、ステータスコード 200 と名前 alice を返します。
curl -i -X GET \ http://localhost:8080/frontend/admin-name-with-oidc-client-token
curl -i -X GET \
http://localhost:8080/frontend/admin-name-with-oidc-client-token
前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。
次に、プログラムで作成された OIDC クライアントが、リアクティブモードと命令型 (ブロッキング) モードの両方で、RestClientWithTokenHeaderParam を使用してトークンを正しく取得して伝播することをテストします。
/user-name-with-oidc-client-token-header-param を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。
curl -i -X GET \ http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param
curl -i -X GET \
http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param
/admin-name-with-oidc-client-token-header-param を呼び出します。前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。
curl -i -X GET \ http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param
curl -i -X GET \
http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param
次に、ブロッキングモードで OIDC クライアントを使用するエンドポイントをテストします。
/user-name-with-oidc-client-token-header-param-blocking を呼び出します。このコマンドは、ステータスコード 200 と名前 alice を返します。
curl -i -X GET \ http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param-blocking
curl -i -X GET \
http://localhost:8080/frontend/user-name-with-oidc-client-token-header-param-blocking
/admin-name-with-oidc-client-token-header-param-blocking を呼び出します。前のコマンドとは対照的に、このコマンドは 403 ステータスコードを返します。
curl -i -X GET \ http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param-blocking
curl -i -X GET \
http://localhost:8080/frontend/admin-name-with-oidc-client-token-header-param-blocking