OpenID Connect (OIDC) 認証
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
多様性を受け入れるオープンソースの強化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、用語の置き換えは、今後の複数のリリースにわたって段階的に実施されます。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 OpenID Connect (OIDC) ベアラートークン認証 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus OpenID Connect (OIDC) エクステンションを使用して、ベアラートークン認証により、アプリケーション内の Jakarta REST (旧称 JAX-RS) エンドポイントへの HTTP アクセスを保護します。
1.1. Quarkus のベアラートークン認証メカニズムの概要 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus は、Quarkus OpenID Connect (OIDC) エクステンションを通じて、ベアラートークン認証メカニズムをサポートします。
ベアラートークンは、OIDC と、Keycloak などの OAuth 2.0 準拠の認可サーバーによって発行されます。
ベアラートークン認証は、ベアラートークンの存在と有効性に基づいて HTTP リクエストを承認するプロセスです。ベアラートークンは、呼び出しのサブジェクトに関する情報を提供します。これは、HTTP リソースにアクセスできるかどうかを判断するために使用されます。
次の図は、Quarkus のベアラートークン認証メカニズムの概要を示しています。
図1.1 シングルページアプリケーションを使用した Quarkus のベアラートークン認証メカニズム
- Quarkus サービスは、OIDC プロバイダーから検証キーを取得します。検証キーは、ベアラーアクセストークンの署名を検証するために使用されます。
- Quarkus ユーザーは、シングルページアプリケーション (SPA) にアクセスします。
- 単一ページアプリケーションは、Authorization Code Flow を使用してユーザーを認証し、OIDC プロバイダーからトークンを取得します。
- シングルページアプリケーションは、アクセストークンを使用して、Quarkus サービスからサービスデータを取得します。
- Quarkus サービスは、検証キーを使用してベアラーアクセストークンの署名を検証し、トークンの有効期限やその他のリクエストをチェックします。トークンが有効な場合はリクエストを続行できるようにし、シングルページアプリケーションにサービス応答を返します。
- シングルページアプリケーションは、Quarkus ユーザーに同じデータを返します。
図1.2 Java またはコマンドラインクライアントを使用した Quarkus のベアラートークン認証メカニズム
- Quarkus サービスは、OIDC プロバイダーから検証キーを取得します。検証キーは、ベアラーアクセストークンの署名を検証するために使用されます。
-
クライアントが、
client_credentialsかパスワードグラントを使用して、OIDC プロバイダーからアクセストークンを取得します。client_credentials には、クライアント ID とシークレットが必要です。パスワードグラントには、クライアント ID、シークレット、ユーザー名、およびパスワードが必要です。 - クライアントはアクセストークンを使用して、Quarkus サービスからサービスデータを取得します。
- Quarkus サービスは、検証キーを使用してベアラーアクセストークンの署名を検証し、トークンの有効期限やその他のクレームをチェックして、トークンが有効な場合はリクエストの続行を許可し、サービスレスポンスをクライアントに返します。
OIDC 認可コードフローを使用してユーザーを認証および認可する必要がある場合は、Quarkus ガイド Web アプリケーションを保護するための OpenID Connect 認可コードフローメカニズム を参照してください。また、Keycloak およびベアラートークンを使用する場合は、Quarkus ガイド Using Keycloak to centralize authorization を参照してください。
OIDC ベアラートークン認証を使用してサービスアプリケーションを保護する方法は、次のチュートリアルを参照してください: * OpenID Connect (OIDC) 認可コードフローを使用した Web アプリケーションの保護
複数のテナントをサポートする方法の詳細は、Quarkus ガイドの OpenID Connect マルチテナンシーの使用 を参照してください。
1.1.1. JWT クレームへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
JWT トークンクレームにアクセスする必要がある場合は、JsonWebToken を注入します。
JsonWebToken の注入は、@ApplicationScoped、@Singleton、および @RequestScoped スコープでサポートされています。ただし、個々のクレームが単純な型として注入される場合は、@RequestScoped を使用する必要があります。詳細は、Quarkus ガイドの "Using JWT RBAC" の Supported injection scopes セクションを参照してください。
1.1.2. UserInfo リンクのコピーリンクがクリップボードにコピーされました!
OIDC UserInfo エンドポイントから UserInfo JSON オブジェクトをリクエストする必要がある場合は、quarkus.oidc.authentication.user-info-required=true を設定します。OIDC プロバイダーの UserInfo エンドポイントにリクエストが送信され、io.quarkus.oidc.UserInfo (単純な javax.json.JsonObject ラッパー) オブジェクトが作成されます。io.quarkus.oidc.UserInfo は、SecurityIdentity userinfo 属性として注入またはアクセスできます。
1.1.3. 設定メタデータ リンクのコピーリンクがクリップボードにコピーされました!
現在のテナントの検出された OpenID Connect 設定メタデータ は、io.quarkus.oidc.OidcConfigurationMetadata で表され、SecurityIdentity configuration-metadata 属性として注入またはアクセスできます。
エンドポイントがパブリックの場合、デフォルトのテナントの OidcConfigurationMetadata が注入されます。
1.1.4. トークンクレームと SecurityIdentity ロール リンクのコピーリンクがクリップボードにコピーされました!
検証済みの JWT アクセストークンから SecurityIdentity ロールを次のようにマップできます。
-
quarkus.oidc.roles.role-claim-pathプロパティーが設定されており、一致する配列または文字列のクレームが見つかった場合、これらのクレームからロールが展開されます。たとえば、customroles、customroles/array、scope、"http://namespace-qualified-custom-claim"/roles、"http://namespace-qualified-roles"などです。 -
groupsクレームが利用可能な場合は、その値が使用されます。 -
realm_access/rolesまたはresource_access/client_id/roles(client_idはquarkus.oidc.client-idプロパティーの値) クレームが利用可能な場合は、その値が使用されます。このチェックは、Keycloak によって発行されたトークンをサポートします。
たとえば、次の JWT トークンには、ロールを含む roles 配列のある複雑な groups クレームがあります。
microprofile_jwt_user ロールを SecurityIdentity ロールにマップする必要があります。これは、quarkus.oidc.roles.role-claim-path=groups/roles という設定で実行できます。
トークンが不透明 (バイナリー) の場合、リモートトークンイントロスペクション応答の scope プロパティーが使用されます。
UserInfo がロールのソースである場合は、quarkus.oidc.authentication.user-info-required=true および quarkus.oidc.roles.source=userinfo を設定し、必要に応じて quarkus.oidc.roles.role-claim-path を設定します。
さらに、カスタム SecurityIdentityAugmentor を使用して、ロールを追加することもできます。詳細は、Quarkus ガイド "Security Tips and Tricks" の Security identity customization セクションを参照してください。
HTTP セキュリティーポリシー を使用して、トークン要求から作成された SecurityIdentity ロールをデプロイメント固有のロールにマップすることもできます。
1.1.5. トークンスコープと SecurityIdentity 権限 リンクのコピーリンクがクリップボードにコピーされました!
SecurityIdentity 権限は、ロールのソース のスコープパラメーターから io.quarkus.security.StringPermission の形式でマッピングされ、同じクレームセパレーターが使用されます。
io.quarkus.security.PermissionsAllowed アノテーションの詳細は、"Authorization of web endpoints" の 権限のアノテーション セクションを参照してください。
1.1.6. トークンの検証とイントロスペクション リンクのコピーリンクがクリップボードにコピーされました!
トークンが JWT トークンの場合、デフォルトでは、OIDC プロバイダーの JWK エンドポイントから取得されたローカル JsonWebKeySet の JsonWebKey (JWK) キーを使用して検証されます。トークンのキー識別子 (kid) ヘッダー値は、一致する JWK キーを見つけるために使用されます。一致する JWK がローカルで利用できない場合は、JWK エンドポイントから現在のキーセットを取得して JsonWebKeySet が更新されます。JsonWebKeySet の更新は、quarkus.oidc.token.forced-jwk-refresh-interval の有効期限が切れた後にのみ、繰り返すことができます。デフォルトの有効期限は 10 分です。更新後に一致する JWK が利用できない場合は、JWT トークンが OIDC プロバイダーのトークンイントロスペクションエンドポイントに送信されます。
トークンが不透明である場合は、それがバイナリートークンまたは暗号化された JWT トークンである可能性があり、そのトークンは常に OIDC プロバイダーのトークンイントロスペクションエンドポイントに送信されます。
JWT トークンのみを使用しており、一致する JsonWebKey が常に使用可能であることが予想される場合 (たとえば、キーセットを更新した後など)、次の例に示すように、トークンイントロスペクションを無効にする必要があります。
quarkus.oidc.token.allow-jwt-introspection=false quarkus.oidc.token.allow-opaque-token-introspection=false
quarkus.oidc.token.allow-jwt-introspection=false
quarkus.oidc.token.allow-opaque-token-introspection=false
JWT トークンをイントロスペクションのみで検証する必要がある場合があります。これは、イントロスペクションエンドポイントアドレスのみを設定することで強制できます。次のプロパティー設定は、Keycloak を使用してこれを実現する方法の例を示しています。
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus quarkus.oidc.discovery-enabled=false # Token Introspection endpoint: http://localhost:8180/realms/quarkus/protocol/openid-connect/tokens/introspect quarkus.oidc.introspection-path=/protocol/openid-connect/tokens/introspect
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.oidc.discovery-enabled=false
# Token Introspection endpoint: http://localhost:8180/realms/quarkus/protocol/openid-connect/tokens/introspect
quarkus.oidc.introspection-path=/protocol/openid-connect/tokens/introspect
JWT トークンのイントロスペクションをリモートで間接的に実施することには、利点と欠点があります。利点は、2 つのリモート呼び出し (リモート OIDC メタデータ検出呼び出しと、それに続く使用されない検証キーを取得するための別のリモート呼び出し) が不要になることです。欠点は、イントロスペクションエンドポイントアドレスを知って、手動で設定する必要があることです。
この他にも、OIDC メタデータ検出のデフォルトオプションを許可しながら、リモート JWT イントロスペクションのみの実行を要求する方法があります (次の例を参照)。
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus quarkus.oidc.token.require-jwt-introspection-only=true
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.oidc.token.require-jwt-introspection-only=true
このアプローチの利点は、設定がよりシンプルで理解しやすいことです。欠点は、検証キーが取得されない場合でも、イントロスペクションエンドポイントアドレスを検出するためにリモート OIDC メタデータ検出呼び出しが必要になることです。
シンプルな jakarta.json.JsonObject ラッパーオブジェクトである io.quarkus.oidc.TokenIntrospection が作成されます。JWT または不透明トークンのいずれかが正常にイントロスペクトされている場合、SecurityIdentity introspection 属性として注入またはアクセスできます。
1.1.7. トークンイントロスペクションと UserInfo キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
すべての不透明アクセストークンは、リモートでイントロスペクトする必要があります。場合によっては、JWT アクセストークンをイントロスペクトする必要もあります。UserInfo も必要な場合は、OIDC プロバイダーへの後続のリモート呼び出しで同じアクセストークンが使用されます。したがって、UserInfo が必要で、現在のアクセストークンが不透明である場合、そのようなトークンごとに 2 つのリモート呼び出しが行われます。1 つのリモート呼び出しはトークンをイントロスペクトするためのもので、もう 1 つは UserInfo を取得するためのものです。トークンが JWT の場合、イントロスペクトもされている必要がない限り、UserInfo を取得するためのリモート呼び出しは 1 回だけ必要です。
着信ベアラーまたはコードフローアクセストークンごとに最大 2 回のリモート呼び出しを実行するコストが問題になる場合があります。
実稼働環境でこれが当てはまる場合は、トークンイントロスペクションと UserInfo データを 3 分または 5 分などの短期間キャッシュすることを検討してください。
quarkus-oidc は、@ApplicationScoped キャッシュ実装に使用できる quarkus.oidc.TokenIntrospectionCache および quarkus.oidc.UserInfoCache インターフェイスを提供します。次の例に示すように、@ApplicationScoped キャッシュ実装を使用して、quarkus.oidc.TokenIntrospection オブジェクトや quarkus.oidc.UserInfo オブジェクトを保存および取得します。
各 OIDC テナントは、quarkus.oidc.TokenIntrospection データ、quarkus.oidc.UserInfo データ、またはその両方の保存を許可または拒否できます。これには、ブール値 quarkus.oidc."tenant".allow-token-introspection-cache および quarkus.oidc."tenant".allow-user-info-cache プロパティーを使用します。
さらに、quarkus-oidc は quarkus.oidc.TokenIntrospectionCache と quarkus.oidc.UserInfoCache の両方のインターフェイスを実装する、シンプルなデフォルトのメモリーベースのトークンキャッシュを提供します。
デフォルトの OIDC トークンキャッシュは、次のように設定してアクティブ化できます。
デフォルトのキャッシュはトークンをキーとして使用し、各エントリーには TokenIntrospection、UserInfo、またはその両方を含めることができます。max-size のエントリー数までのみが保持されます。新しいエントリーを追加するときにキャッシュがすでにいっぱいになっている場合は、期限切れのエントリーを 1 つ削除してスペースを見つけようとします。さらに、クリーンアップタイマーをアクティベートにすると、期限切れのエントリーが定期的にチェックされ、削除されます。
デフォルトのキャッシュ実装を試したり、カスタムのキャッシュ実装を登録したりできます。
1.1.8. JSON Web Token のクレームの検証 リンクのコピーリンクがクリップボードにコピーされました!
ベアラー JWT トークンの署名が検証され、その expires at (exp) クレームがチェックされた後、次に iss (issuer) クレーム値が検証されます。
デフォルトでは、iss クレーム値は、周知のプロバイダー設定で検出された可能性のある issuer プロパティーと比較されます。ただし、quarkus.oidc.token.issuer プロパティーが設定されている場合は、代わりに iss クレーム値がそれと比較されます。
場合によっては、この ISS クレーム検証が機能しないことがあります。たとえば、検出された issuer プロパティーに内部 HTTP/IP アドレスが含まれているのに、トークンの iss クレーム値に外部 HTTP/IP アドレスが含まれている場合などです。または、検出された issuer プロパティーにテンプレートテナント変数が含まれているが、トークンの iss クレーム値には完全なテナント固有の発行者値が含まれている場合などです。
このような場合は、quarkus.oidc.token.issuer=any を設定して発行者の検証をスキップすることを検討してください。他のオプションが利用できない場合にのみ、発行者の検証をスキップします。
-
Keycloak を使用しており、異なるホストアドレスによって発行者検証エラーが発生する場合は、
KEYCLOAK_FRONTEND_URLプロパティーを使用して Keycloak を設定し、同じホストアドレスが使用されるようにします。 -
マルチテナントデプロイメントで
issプロパティーがテナント固有である場合は、SecurityIdentitytenant-id属性を使用して、エンドポイントまたはカスタム Jakarta フィルターで発行者が正しいことを確認します。以下に例を示します。
quarkus.oidc.token.audience プロパティーを使用して、トークン aud (audience) クレーム値を検証することを検討してください。
1.1.9. シングルページアプリケーション リンクのコピーリンクがクリップボードにコピーされました!
シングルページアプリケーション (SPA) は通常、XMLHttpRequest (XHR) と OIDC プロバイダーが提供する JavaScript ユーティリティーコードを使用して、Quarkus service アプリケーションにアクセスするためのベアラートークンを取得します。
たとえば、Keycloak を使用する場合は、keycloak.js を使用してユーザーを認証し、SPA から期限切れのトークンを更新できます。
1.1.10. Cross-Origin Resource Sharing リンクのコピーリンクがクリップボードにコピーされました!
別のドメインで実行されているシングルページアプリケーションから OIDC サービス アプリケーションを使用する予定の場合は、Cross-Origin Resource Sharing (CORS) を設定する必要があります。詳細は、"Cross-origin resource sharing" の CORS filter セクションを参照してください。
1.1.11. プロバイダーエンドポイントの設定 リンクのコピーリンクがクリップボードにコピーされました!
OIDC service アプリケーションは、OIDC プロバイダーのトークン、JsonWebKey (JWK) セット、そして場合によっては UserInfo およびイントロスペクションエンドポイントアドレスを認識している必要があります。
デフォルトでは、設定された quarkus.oidc.auth-server-url に /.well-known/openid-configuration パスを追加することによって検出されます。
あるいは、検出エンドポイントが利用できない場合、または検出エンドポイントのラウンドトリップを節約したい場合は、検出を無効にして、相対パス値で設定することができます。以下に例を示します。
1.1.12. トークンの伝播 リンクのコピーリンクがクリップボードにコピーされました!
ダウンストリームサービスへのベアラーアクセストークンの伝播に関する詳細は、Quarkus の「OpenID Connect (OIDC) と OAuth2 クライアントおよびフィルターのリファレンス」ガイドの トークンの伝播 セクションを参照してください。
1.1.13. OIDC プロバイダークライアント認証 リンクのコピーリンクがクリップボードにコピーされました!
quarkus.oidc.runtime.OidcProviderClient は、OIDC プロバイダーへのリモートリクエストが必要な場合に使用されます。ベアラートークンのイントロスペクションが必要な場合は、OidcProviderClient が OIDC プロバイダーに対して認証する必要があります。サポート対象認証オプションの詳細は、Quarkus ガイド「Web アプリケーションを保護するための OpenID Connect 認可コードフローメカニズム」の OIDC プロバイダークライアント認証 セクションを参照してください。
1.1.14. テスト リンクのコピーリンクがクリップボードにコピーされました!
Keycloak 認証 を必要とする Quarkus OIDC サービスエンドポイントをテストする必要がある場合は、Keycloak 認可のテスト セクションに従ってください。
次の依存関係をテストプロジェクトに追加することで、テストを開始できます。
Maven を使用:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("io.rest-assured:rest-assured") testImplementation("io.quarkus:quarkus-junit5")testImplementation("io.rest-assured:rest-assured") testImplementation("io.quarkus:quarkus-junit5")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.14.1. WireMock リンクのコピーリンクがクリップボードにコピーされました!
テストプロジェクトに次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-oidc-server</artifactId> <scope>test</scope> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-oidc-server</artifactId> <scope>test</scope> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("io.quarkus:quarkus-test-oidc-server")testImplementation("io.quarkus:quarkus-test-oidc-server")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
REST テストエンドポイントを準備し、application.properties を設定します。以下に例を示します。
keycloak.url is set by OidcWiremockTestResource
# keycloak.url is set by OidcWiremockTestResource
quarkus.oidc.auth-server-url=${keycloak.url}/realms/quarkus/
quarkus.oidc.client-id=quarkus-service-app
quarkus.oidc.application-type=service
最後にテストコードを記述します。以下に例を示します。
quarkus-test-oidc-server エクステンションには、JSON Web Key (JWK) 形式の署名 RSA 秘密鍵ファイルが含まれており、smallrye.jwt.sign.key.location 設定プロパティーでそのファイルを指します。引数なしの sign() 操作を使用してトークンに署名できます。
OidcWiremockTestResource を使用して quarkus-oidc service アプリケーションをテストすると、通信チャネルも WireMock HTTP スタブに対してテストされるため、最高のカバレッジが提供されます。OidcWiremockTestResource でまだサポートされていない WireMock スタブを使用してテストを実行する必要がある場合は、次の例に示すように、テストクラスに WireMockServer インスタンスを注入できます。
OidcWiremockTestResource は、Docker コンテナーに対して @QuarkusIntegrationTest では機能しません。これは、WireMock サーバーがテストを実行する JVM で実行され、Quarkus アプリケーションを実行する Docker コンテナーからはアクセスできないためです。
1.1.15. OidcTestClient リンクのコピーリンクがクリップボードにコピーされました!
Auth0 などの SaaS OIDC プロバイダーを使用していて、テスト (開発) ドメインに対してテストを実行したり、リモート Keycloak テストレルムに対してテストを実行したりする場合、quarkus.oidc.auth-server-url がすでに設定されている場合は、OidcTestClient を使用できます。
たとえば、次のような設定があるとします。
%test.quarkus.oidc.auth-server-url=https://dev-123456.eu.auth0.com/ %test.quarkus.oidc.client-id=test-auth0-client %test.quarkus.oidc.credentials.secret=secret
%test.quarkus.oidc.auth-server-url=https://dev-123456.eu.auth0.com/
%test.quarkus.oidc.client-id=test-auth0-client
%test.quarkus.oidc.credentials.secret=secret
まず、WireMock セクションで説明されているものと同じ依存関係 quarkus-test-oidc-server を追加します。
次に、次のようにテストコードを記述します。
このテストコードは、クライアント ID test-auth0-client でアプリケーションを登録し、パスワード alice でユーザー alice を作成したテスト Auth0 ドメインから password 付与を使用してトークンを取得します。このようなテストが機能するには、テスト Auth0 アプリケーションで password 付与が有効になっている必要があります。このサンプルコードでは、追加のパラメーターを渡す方法も示しています。Auth0 の場合、これらは audience と scope パラメーターです。
1.1.15.1. Dev Services for Keycloak リンクのコピーリンクがクリップボードにコピーされました!
Keycloak に対する結合テストを行う際に推奨される手法は、Dev Services for Keycloak です。Dev Services for Keycloak が起動し、テストコンテナーを初期化します。次に、quarkus レルムと quarkus-app クライアント (secret シークレット) を作成し、alice (admin および user ロール) および bob (user ロール) ユーザーを追加します。これらのプロパティーはすべてカスタマイズできます。
まず、アクセストークンを取得するためのテストで使用できるユーティリティークラス io.quarkus.test.keycloak.client.KeycloakTestClient を提供する次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-keycloak-server</artifactId> <scope>test</scope> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-keycloak-server</artifactId> <scope>test</scope> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("io.quarkus:quarkus-test-keycloak-server")testImplementation("io.quarkus:quarkus-test-keycloak-server")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次に、application.properties 設定ファイルを準備します。Dev Services for Keycloak は quarkus.oidc.auth-server-url を登録し、それを実行中のテストコンテナー quarkus.oidc.client-id=quarkus-app および quarkus.oidc.credentials.secret=secret を指すため、空の application.properties ファイルから開始できます。
ただし、必要な quarkus-oidc プロパティーをすでに設定している場合は、次の例に示すように、quarkus.oidc.auth-server-url を `Dev Services for Keycloak` の prod プロファイルに関連付けるだけでコンテナーを起動できます。
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
テストを実行する前にカスタムレルムファイルを Keycloak にインポートする必要がある場合は、次のように Dev Services for Keycloak を設定します。
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus quarkus.keycloak.devservices.realm-path=quarkus-realm.json
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.keycloak.devservices.realm-path=quarkus-realm.json
最後に、次の例に示すように、JVM モードで実行されるテストを記述します。
JVM モードで実行されたテストの例:
ネイティブモードで実行されたテストの例:
Dev Services for Keycloak の初期化と設定の詳細は、Dev Services for Keycloak ガイドを参照してください。
1.1.15.2. ローカル公開鍵 リンクのコピーリンクがクリップボードにコピーされました!
次の例に示すように、ローカルのインライン公開鍵を使用して quarkus-oidc service アプリケーションをテストできます。
quarkus.oidc.client-id=test quarkus.oidc.public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEqFyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwRTYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5eUF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYnsIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9xnQIDAQAB smallrye.jwt.sign.key.location=/privateKey.pem
quarkus.oidc.client-id=test
quarkus.oidc.public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEqFyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwRTYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5eUF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYnsIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9xnQIDAQAB
smallrye.jwt.sign.key.location=/privateKey.pem
JWT トークンを生成するには、main Quarkus リポジトリーの integration-tests/oidc-tenancy から privateKey.pem をコピーし、前の WireMock セクションのものと同様のテストコードを使用します。必要に応じて、独自のテストキーを使用することもできます。
このアプローチでは、WireMock アプローチと比較してカバレッジが制限されます。たとえば、リモート通信コードはカバーされません。
1.1.15.3. TestSecurity アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@TestSecurity および @OidcSecurity アノテーションを使用して、次のインジェクションのいずれか 1 つまたは 3 つすべてに依存する service アプリケーションエンドポイントコードをテストできます。
-
JsonWebToken -
UserInfo -
OidcConfigurationMetadata
まず、次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-security-oidc</artifactId> <scope>test</scope> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-security-oidc</artifactId> <scope>test</scope> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("io.quarkus:quarkus-test-security-oidc")testImplementation("io.quarkus:quarkus-test-security-oidc")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次の例に示すようにテストコードを記述します。
このコード例で使用されている ProtectedResource クラスは、次のようになります。
常に @TestSecurity アノテーションを使用する必要があります。その user プロパティーは JsonWebToken.getName() として返され、その roles プロパティーは JsonWebToken.getGroups() として返されます。@OidcSecurity アノテーションは任意です。これを使用すると、追加のトークンクレームと UserInfo および OidcConfigurationMetadata プロパティーを設定できます。さらに、quarkus.oidc.token.issuer プロパティーが設定されている場合は、OidcConfigurationMetadata issuer プロパティー値として使用されます。
不透明なトークンを使用する場合は、次のコード例に示すようにテストできます。
このコード例で使用されている ProtectedResource クラスは、次のようになります。
@TestSecurity、user、および roles 属性は、TokenIntrospection、username、および scope プロパティーとして使用できます。io.quarkus.test.security.oidc.TokenIntrospection を使用して、email などの追加のイントロスペクション応答プロパティーを追加します。
@TestSecurity と @OidcSecurity は、次の例に示すように、メタアノテーションで組み合わせることができます。
これは、複数のテスト方法で同じセキュリティー設定セットを使用する必要がある場合に特に便利です。
1.1.16. ログエラーの確認 リンクのコピーリンクがクリップボードにコピーされました!
トークン検証エラーの詳細を確認するには、io.quarkus.oidc.runtime.OidcProvider と TRACE レベルのロギングを有効にします。
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE
OidcProvider クライアント初期化エラーの詳細を確認するには、次のように io.quarkus.oidc.runtime.OidcRecorder と TRACE レベルのロギングを有効にします。
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".level=TRACE quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".min-level=TRACE
1.1.17. OIDC プロバイダーへの外部および内部アクセス リンクのコピーリンクがクリップボードにコピーされました!
OIDC プロバイダーおよびその他のエンドポイントの外部アクセス可能なトークンは、quarkus.oidc.auth-server-url 内部 URL を基準として自動検出された URL または設定された URL とは異なる HTTP(S) URL を持つ場合があります。たとえば、SPA が外部トークンエンドポイントアドレスからトークンを取得し、それをベアラートークンとして Quarkus に送信するとします。その場合、エンドポイントは発行者の検証の失敗を報告する可能性があります。
このような場合、Keycloak を使用する場合は、KEYCLOAK_FRONTEND_URL システムプロパティーを外部からアクセス可能なベース URL に設定して起動します。他の OIDC プロバイダーを使用する場合は、プロバイダーのドキュメントを参照してください。
1.1.18. client-id プロパティーの使用 リンクのコピーリンクがクリップボードにコピーされました!
quarkus.oidc.client-id プロパティーは、現在のベアラートークンをリクエストした OIDC クライアントを識別します。OIDC クライアントは、ブラウザーで実行される SPA アプリケーション、または Quarkus service アプリケーションにアクセストークンを伝播する Quarkus web-app の機密クライアントアプリケーションです。
service アプリケーションがトークンをリモートでイントロスペクトすることが予想される場合、このプロパティーは必須です。これは、不透明トークンの場合は常に該当します。このプロパティーは、ローカル JSON Web Token (JWT) 検証の場合のみのオプションです。
エンドポイントがリモートイントロスペクションエンドポイントへのアクセスを必要としない場合でも、quarkus.oidc.client-id プロパティーを設定することを推奨します。これは、client-id が設定されている場合、それを使用してトークン audience を検証できるためです。また、トークンの検証が失敗した場合にもログに含まれるため、特定のクライアントに発行されたトークンの追跡可能性が向上し、より長い期間にわたる分析が可能になります。
たとえば、OIDC プロバイダーがトークン audience を設定する場合は、次の設定パターンを検討してください。
Set client-id Token audience claim must contain 'quarkus-app'
# Set client-id
quarkus.oidc.client-id=quarkus-app
# Token audience claim must contain 'quarkus-app'
quarkus.oidc.token.audience=${quarkus.oidc.client-id}
quarkus.oidc.client-id を設定したが、エンドポイントが OIDC プロバイダーエンドポイントの 1 つへのリモートアクセスを必要としない場合 (イントロスペクション、トークンの取得など) は、quarkus.oidc.credentials または同様のプロパティーを使用してクライアントシークレットを設定しないでください (このプロパティーは使用されないため)。
Quarkus web-app アプリケーションには常に quarkus.oidc.client-id プロパティーが必要です。
1.2. HTTP リクエストが完了した後の認証 リンクのコピーリンクがクリップボードにコピーされました!
場合によっては、アクティブな HTTP リクエストコンテキストが存在しない場合に、特定のトークンの SecurityIdentity を作成する必要があります。quarkus-oidc エクステンションは、トークンを SecurityIdentity インスタンスに変換するための io.quarkus.oidc.TenantIdentityProvider を提供します。たとえば、HTTP リクエストが完了した後にトークンを検証する必要がある状況の 1 つは、Vert.x event bus を使用してメッセージを処理している場合です。以下の例では、さまざまな CDI リクエストコンテキスト内で 'product-order' メッセージを使用しています。したがって、注入された SecurityIdentity は検証された ID を正しく表さず、匿名になります。
- 1
- この時点では、プロアクティブ認証が無効になっているとトークンは検証されません。
HTTP リクエスト中にプロバイダーが使用される場合、OpenID Connect マルチテナンシーの使用 ガイドで説明されているように、テナント設定を解決できます。ただし、アクティブな HTTP リクエストがない場合は、io.quarkus.oidc.TenantFeature 修飾子を使用してテナントを明示的に選択する必要があります。
動的テナント設定の解決 は現在サポートされていません。動的テナントを必要とする認証は失敗します。
1.3. OIDC リクエストフィルター リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の OidcRequestFilter 実装を登録することで、Quarkus から OIDC プロバイダーに対して行われた OIDC リクエストをフィルタリングできます。これにより、新しいリクエストヘッダーを更新または追加したり、リクエストをログに記録したりできます。詳細は、OIDC リクエストフィルター を参照してください。
1.4. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
- OIDC 設定プロパティー
- OIDC ベアラートークン認証を使用してサービスアプリケーションを保護する
- Keycloak のドキュメント
- OpenID Connect
- JSON Web Token
- OpenID Connect および OAuth2 クライアントとフィルターのリファレンスガイド
- Dev Services for Keycloak
- SmallRye JWT Build で JWT トークンに署名して暗号化する
- OpenID Connect、SmallRye JWT、OAuth2 認証メカニズムの選択
- 認証メカニズムの組み合わせ
- Quarkus Security の概要
- OpenID Connect マルチテナンシーの使用
第2章 OpenID Connect (OIDC) ベアラートークン認証を使用したサービスアプリケーションの保護 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus OpenID Connect (OIDC) エクステンションを使用して、ベアラートークン認証で Jakarta REST アプリケーションを保護します。ベアラートークンは、OIDC と、Keycloak などの OAuth 2.0 準拠の認可サーバーによって発行されます。
OIDC ベアラートークン認証の詳細は、Quarkus ガイド OpenID Connect (OIDC) ベアラートークン認証 を参照してください。
OIDC 認可コードフロー認証を使用して Web アプリケーションを保護する場合は、Web アプリケーションを保護するための OpenID Connect 認可コードフローメカニズム ガイドを参照してください。
2.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAV_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.9.6
- 動作するコンテナーランタイム (Docker または Podman)
- オプションで使用する場合は Quarkus CLI
- ネイティブ実行可能ファイル (ネイティブコンテナービルドを使用する場合は Docker) をビルドする必要がある場合は、オプションで Mandrel または GraalVM がインストールされ、適切に設定されている
- jq コマンドラインプロセッサーツール
2.2. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
この例では、2 つのエンドポイントを提供するシンプルなマイクロサービスをビルドする方法を示します。
-
/api/users/me -
/api/admin
これらのエンドポイントは保護されており、クライアントがリクエストとともにベアラートークンを送信した場合にのみアクセスできます。ベアラートークンは有効 (署名、有効期限、audience など) であり、マイクロサービスによって信頼されている必要があります。
Keycloak サーバーはベアラートークンを発行し、トークンが発行されたサブジェクトを表します。これは OAuth 2.0 認可サーバーであるため、トークンはユーザーに代わって動作するクライアントも参照します。
有効なトークンを持つすべてのユーザーは、/api/users/me エンドポイントにアクセスできます。レスポンスとして、トークンの情報から取得したユーザーの詳細を含む JSON ドキュメントを返します。
/api/admin エンドポイントは RBAC (ロールベースのアクセス制御) で保護されており、admin ロールを持つユーザーのみがアクセスできます。このエンドポイントでは、@RolesAllowed アノテーションを使用して、アクセス制約を宣言的に適用します。
2.3. ソリューション リンクのコピーリンクがクリップボードにコピーされました!
次のセクションの指示に従って、アプリケーションを段階的に作成します。完成した例に直接進むこともできます。
git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.8 コマンドを実行して Git リポジトリーをクローンするか、アーカイブ をダウンロードすることができます。
ソリューションは、security-openid-connect-quickstartディレクトリー にあります。
2.4. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
oidc エクステンションを使用して新しい Maven プロジェクトを作成することも、既存の Maven プロジェクトにエクステンションを追加することもできます。次のいずれかのコマンドを実行します。
新しい Maven プロジェクトを作成するには、次のコマンドを使用します。
Quarkus CLI を使用:
quarkus create app org.acme:security-openid-connect-quickstart \ --extension='oidc,resteasy-reactive-jackson' \ --no-code cd security-openid-connect-quickstartquarkus create app org.acme:security-openid-connect-quickstart \ --extension='oidc,resteasy-reactive-jackson' \ --no-code cd security-openid-connect-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-quickstart")。
Quarkus プロジェクトがすでに設定されている場合は、プロジェクトベースディレクトリーで次のコマンドを実行して、oidc エクステンションをプロジェクトに追加できます。
Quarkus CLI を使用:
quarkus extension add oidc
quarkus extension add oidcCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用:
./mvnw quarkus:add-extension -Dextensions='oidc'
./mvnw quarkus:add-extension -Dextensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
./gradlew addExtension --extensions='oidc'
./gradlew addExtension --extensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これにより、ビルドファイルに次の内容が追加されます。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency>
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
implementation("io.quarkus:quarkus-oidc")implementation("io.quarkus:quarkus-oidc")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5. アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
次の例に示すように、通常の Jakarta REST リソースである
/api/users/meエンドポイントを実装します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例に示すように、
/api/adminエンドポイントを実装します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この例の主な違いは、
@RolesAllowedアノテーションを使用して、adminロールを付与されたユーザーのみがエンドポイントにアクセスできることを確認することです。
SecurityIdentity の注入は、@RequestScoped コンテキストと @ApplicationScoped コンテキストの両方でサポートされています。
2.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
src/main/resources/application.propertiesファイルで次の設定プロパティーを設定して、Quarkus OpenID Connect (OIDC) エクステンションを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
詳細は以下のようになります。
-
%prod.quarkus.oidc.auth-server-urlは、OpenID Connect (OIDC) サーバーのベース URL を設定します。%prod.プロファイル接頭辞により、アプリケーションを開発 (dev) モードで実行するときに、Dev Services for Keycloakがコンテナーを起動します。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。 -
quarkus.oidc.client-idは、アプリケーションを識別するクライアント ID を設定します。 -
quarkus.oidc.credentials.secretは、client_secret_basic認証方法で使用されるクライアントシークレットを設定します。
詳細は、Quarkus ガイドの OpenID Connect (OIDC) 設定プロパティー を参照してください。
2.7. Keycloak サーバーの起動と設定 リンクのコピーリンクがクリップボードにコピーされました!
レルム設定ファイル をクラスパス (
target/classesディレクトリー) に配置して、開発モードで実行するときに自動的にインポートされるようにします。すでに 完全なソリューション をビルドしている場合は、これを行う必要はありません。その場合、このレルムファイルはビルド中にクラスパスに追加されます。注記アプリケーションを開発モードで実行するときは、Keycloak サーバーを起動しないでください。
Dev Services for Keycloakがコンテナーを起動します。詳細は、開発モードでのアプリケーションの実行 セクションを参照してください。Keycloak サーバーをが起動するには、Docker を使用して次のコマンドを実行します。
docker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-devdocker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-devCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
keycloak.versionがバージョン24.0.0以降に設定されている場合。
-
- Keycloak サーバーには localhost:8180 からアクセスできます。
Keycloak 管理コンソールにアクセスするには、次のログイン認証情報を使用して
adminユーザーとしてログインします。-
ユーザー名:
admin -
パスワード:
admin
-
ユーザー名:
- 新しいレルムを作成するには、アップストリームコミュニティーリポジトリーから レルム設定ファイル をインポートします。
詳細は、新しいレルムの作成と設定 に関する Keycloak のドキュメントを参照してください。
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カードで、Keycloak providerリンクをクリックします。 OpenID Connect Dev UIによって提供されるSingle Page Applicationにログインするように求められたら、次の手順を実行します。userロールを持つalice(パスワード:alice) としてログインします。-
/api/adminにアクセスすると、ステータスコード403が返されます。 -
/api/users/meにアクセスすると、ステータスコード200が返されます。
-
ログアウトし、
adminとuserの両方のロールを持つadmin(パスワード:admin) として再度ログインします。-
/api/adminにアクセスすると、ステータスコード200が返されます。 -
/api/users/meにアクセスすると、ステータスコード200が返されます。
-
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.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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.package.type=native
./gradlew build -Dquarkus.package.type=nativeCopy 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-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.11. アプリケーションをテストする リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションをテストする方法は、前述の 開発モードでのアプリケーションの実行 セクションを参照してください。
curl を使用して、JVM モードまたはネイティブモードで起動されたアプリケーションをテストできます。
- アプリケーションはベアラートークン認証を使用するため、アプリケーションリソースにアクセスするには、まず Keycloak サーバーからアクセストークンを取得する必要があります。
上記の例では、ユーザー alice のアクセストークンを取得します。
-
どのユーザーも
http://localhost:8080/api/users/meエンドポイントにアクセスでき、ユーザーの詳細を含む JSON ペイロードが返されます。
curl -v -X GET \ http://localhost:8080/api/users/me \ -H "Authorization: Bearer "$access_token
curl -v -X GET \
http://localhost:8080/api/users/me \
-H "Authorization: Bearer "$access_token
-
adminロールを持つユーザーのみがhttp://localhost:8080/api/adminエンドポイントにアクセスできます。以前に発行されたアクセストークンを使用してこのエンドポイントにアクセスしようとすると、サーバーから403応答が返されます。
curl -v -X GET \ http://localhost:8080/api/admin \ -H "Authorization: Bearer "$access_token
curl -v -X GET \
http://localhost:8080/api/admin \
-H "Authorization: Bearer "$access_token
-
管理エンドポイントにアクセスするには、
adminユーザーのトークンを取得します。
Dev Services for Keycloak に依存する結合テストの作成に関する詳細は、「OpenID Connect (OIDC) ベアラートークン認証」ガイドの Dev Services for Keycloak セクションを参照してください。
2.12. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第3章 Web アプリケーションを保護するための OpenID Connect 認可コードフローメカニズム リンクのコピーリンクがクリップボードにコピーされました!
Web アプリケーションを保護するには、Quarkus OIDC エクステンションによって提供される業界標準の OpenID Connect (OIDC) 認可コードフローメカニズムを使用できます。
3.1. OIDC 認可コードフローメカニズムの概要 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus OpenID Connect (OIDC) エクステンションは、Keycloak などの OIDC 準拠の認可サーバーによってサポートされている OIDC 認可コードフローメカニズムを使用して、アプリケーションの HTTP エンドポイントを保護できます。
認可コードフローメカニズムは、Web アプリケーションのユーザーを Keycloak などの OIDC プロバイダーにリダイレクトしてログインさせることで、ユーザーを認証します。認証後、OIDC プロバイダーは、認証が成功したことを確認する認可コードを使用してユーザーをアプリケーションにリダイレクトします。次に、アプリケーションは、このコードを OIDC プロバイダーと交換して、ID トークン (認証されたユーザーを表す)、アクセストークン、および更新トークンを取得し、ユーザーのアプリケーションへのアクセスを認可します。
次の図は、Quarkus の認可コードフローのメカニズムの概要を示しています。
図3.1 Quarkus の認可コードフローメカニズム
-
Quarkus ユーザーは、Quarkus
web-appアプリケーションへのアクセスを要求します。 - Quarkus web-app は、ユーザーを認可エンドポイント、つまり認証用の OIDC プロバイダーにリダイレクトします。
- OIDC プロバイダーは、ユーザーをログインおよび認証プロンプトにリダイレクトします。
- ユーザーは、プロンプトが表示されたらユーザー認証情報を入力します。
- OIDC プロバイダーは、入力されたユーザー認証情報を認証し、成功した場合は認可コードを発行して、クエリーパラメーターとして含まれたコードを使用してユーザーを Quarkus web-app にリダイレクトします。
- Quarkus web-app は、この認可コードを OIDC プロバイダーと交換して、ID、アクセストークン、および更新トークンを取得します。
認可コードフローが完了し、Quarkus web-app は発行されたトークンを使用してユーザーに関する情報にアクセスし、そのユーザーに関連するロールベースの認可を付与します。以下のトークンが発行されます。
-
ID トークン: Quarkus
web-appアプリケーションは、ID トークン内のユーザー情報を使用することで、認証されたユーザーが安全にログインし、Web アプリケーションへのロールベースのアクセスを提供できるようにします。 - アクセストークン: Quarkus web-app は、アクセストークンを使用して UserInfo API にアクセスし、認証されたユーザーに関する追加情報を取得したり、それを別のエンドポイントに伝播したりする可能性があります。
- 更新トークン: (オプション) ID とアクセストークンの有効期限が切れた場合、Quarkus web-app は更新トークンを使用して、新しい ID とアクセストークンを取得できます。
OIDC 設定プロパティー も参照してください。
OIDC 認可コードフローメカニズムを使用して Web アプリケーションを保護する方法の詳細は、OIDC 認可コードフローを使用した Web アプリケーションの保護 を参照してください。
OIDC ベアラートークン認証を使用してサービスアプリケーションを保護する場合は、OIDC ベアラートークン認証 を参照してください。
複数のテナントをサポートする方法の詳細は、OpenID Connect マルチテナンシーの使用 を参照してください。
3.2. 認可コードフローメカニズムの使用 リンクのコピーリンクがクリップボードにコピーされました!
3.2.1. OIDC プロバイダーエンドポイントへのアクセスの設定 リンクのコピーリンクがクリップボードにコピーされました!
OIDC web-app アプリケーションには、OIDC プロバイダーの認可、トークン、JsonWebKey (JWK) セット、および場合によっては UserInfo、イントロスペクション、および end-session (RP によって開始されるログアウト) エンドポイントの URL が必要です。
慣例により、設定された quarkus.oidc.auth-server-url に /.well-known/openid-configuration パスを追加することで検出されます。
あるいは、検出エンドポイントが利用できない場合、または検出エンドポイントのラウンドトリップを減らしたい場合は、エンドポイント検出を無効にして相対パス値を設定できます。以下に例を示します。
一部の OIDC プロバイダーはメタデータ検出をサポートしていますが、認可コードフローを完了したり、ユーザーログアウトなどのアプリケーション機能をサポートしたりするために必要なエンドポイント URL 値をすべて返すわけではありません。この制限を回避するには、次の例に示すように、不足しているエンドポイント URL 値をローカルで設定します。
検出されたエンドポイント URL がローカル Quarkus エンドポイントで機能せず、より具体的な値が必要な場合は、この同じ設定を使用してその URL をオーバーライドできます。たとえば、グローバルおよびアプリケーション固有の end-session エンドポイントの両方をサポートするプロバイダーは、http://localhost:8180/oidcprovider/account/global-logout などのグローバル end-session URL を返します。この URL により、ユーザーは現在ログインしているすべてのアプリケーションからログアウトされます。ただし、現在のアプリケーションでユーザーを特定のアプリケーションからのみログアウトする必要がある場合は、quarkus.oidc.end-session-path=logout パラメーターを設定することで、グローバル end-session URL をオーバーライドできます。
3.2.1.1. OIDC プロバイダークライアント認証 リンクのコピーリンクがクリップボードにコピーされました!
OIDC プロバイダーでは通常、アプリケーションが OIDC エンドポイントと対話するときに、そのアプリケーションを識別して認証する必要があります。Quarkus OIDC (具体的には quarkus.oidc.runtime.OidcProviderClient クラス) は、認可コードを ID、アクセストークン、および更新トークンと交換する必要がある場合、または ID トークンとアクセストークンを更新またはイントロスペクトする必要がある場合に、OIDC プロバイダーに対して認証を行います。
通常、クライアント ID とクライアントシークレットは、特定のアプリケーションが OIDC プロバイダーに登録されるときに定義されます。すべての OIDC クライアント認証 オプションがサポートされています。以下に例を示します。
client_secret_basic の例:
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/ quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.secret=mysecret
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.secret=mysecret
または、以下を実行します。
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/ quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.client-secret.value=mysecret
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.client-secret.value=mysecret
次の例は、認証情報プロバイダー から取得したシークレットを示しています。
client_secret_post の例
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/ quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.client-secret.value=mysecret quarkus.oidc.credentials.client-secret.method=post
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.client-secret.value=mysecret
quarkus.oidc.credentials.client-secret.method=post
client_secret_jwt の例 (署名アルゴリズムは HS256):
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/ quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.jwt.secret=AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
シークレットが 認証情報プロバイダー から取得される client_secret_jwt の例:
PEM キーファイルを使用した private_key_jwt の例 (署名アルゴリズムは RS256):
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/ quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.jwt.key-file=privateKey.pem
quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus/
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.jwt.key-file=privateKey.pem
キーストアファイルを使用した private_key_jwt の例 (署名アルゴリズムは RS256):
client_secret_jwt または private_key_jwt 認証方法を使用すると、クライアントシークレットが OIDC プロバイダーに送信されないため、'中間者攻撃' によってシークレットが傍受されるリスクを回避できます。
3.2.1.1.1. 追加の JWT 認証オプション リンクのコピーリンクがクリップボードにコピーされました!
client_secret_jwt、private_key_jwt、または Apple post_jwt 認証方法を使用する場合は、JWT 署名アルゴリズム、キー識別子、audience、サブジェクト、発行者をカスタマイズできます。以下に例を示します。
3.2.1.1.2. Apple POST JWT リンクのコピーリンクがクリップボードにコピーされました!
Apple OIDC プロバイダーは client_secret_post メソッドを使用します。この方法では、シークレットは private_key_jwt 認証方法で生成された JWT ですが、Apple アカウント固有の発行者とサブジェクトのクレームが含まれます。
Quarkus Security では、quarkus-oidc が非標準の client_secret_post_jwt 認証方法をサポートします。この認証方法は次のように設定できます。
3.2.1.1.3. 相互 TLS (mTLS) リンクのコピーリンクがクリップボードにコピーされました!
一部の OIDC プロバイダーでは、相互 TLS 認証プロセスの一部としてクライアントが認証されることが必要になる場合があります。
次の例は、quarkus-oidc を mTLS をサポートするように設定する方法を示しています。
3.2.1.1.4. POST クエリー リンクのコピーリンクがクリップボードにコピーされました!
Strava OAuth2 プロバイダー などの一部のプロバイダーでは、クライアントクレデンシャルを HTTP POST クエリーパラメーターとして送信する必要があります。
quarkus.oidc.provider=strava quarkus.oidc.client-id=quarkus-app quarkus.oidc.credentials.client-secret.value=mysecret quarkus.oidc.credentials.client-secret.method=query
quarkus.oidc.provider=strava
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.client-secret.value=mysecret
quarkus.oidc.credentials.client-secret.method=query
3.2.1.2. イントロスペクションエンドポイント認証 リンクのコピーリンクがクリップボードにコピーされました!
一部の OIDC プロバイダーでは、Basic 認証と client_id および client_secret とは異なる認証情報を使用して、イントロスペクションエンドポイントへの認証を行う必要があります。OIDC プロバイダークライアント認証 セクションで説明されているように、client_secret_basic または client_secret_post クライアント認証メソッドのいずれかをサポートするように以前にセキュリティー認証を設定している場合は、次のように追加の設定を適用することを推奨します。
トークンをイントロスペクションする必要があり、イントロスペクションエンドポイント固有の認証メカニズムが必要な場合は、quarkus-oidc を次のように設定できます。
quarkus.oidc.introspection-credentials.name=introspection-user-name quarkus.oidc.introspection-credentials.secret=introspection-user-secret
quarkus.oidc.introspection-credentials.name=introspection-user-name
quarkus.oidc.introspection-credentials.secret=introspection-user-secret
3.2.1.3. OIDC リクエストフィルター リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の OidcRequestFilter 実装を登録することで、Quarkus から OIDC プロバイダーに対して行われた OIDC リクエストをフィルタリングできます。これにより、新しいリクエストヘッダーを更新または追加したり、リクエストをログに記録したりすることもできます。
以下に例を示します。
あるいは、OidcRequestFilter.Endpoint 列挙型を使用して、このフィルターをトークンエンドポイントリクエストにのみ適用することもできます。
- 1
- このフィルターを、OIDC 検出エンドポイントのみを対象とするリクエストに制限します。
3.2.1.4. OIDC プロバイダーへのリダイレクトと OIDC プロバイダーからのリダイレクト リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが認証のために OIDC プロバイダーにリダイレクトされる場合、リダイレクト URL には、認証が完了したときにユーザーをリダイレクトする場所をプロバイダーに指示する redirect_uri クエリーパラメーターが含まれます。この場合、これは Quarkus アプリケーションになります。
Quarkus は、デフォルトでこのパラメーターを現在のアプリケーション要求 URL に設定します。たとえば、ユーザーが http://localhost:8080/service/1 にある Quarkus サービスエンドポイントにアクセスしようとしている場合、redirect_uri パラメーターは http://localhost:8080/service/1 に設定されます。同様に、リクエスト URL が http://localhost:8080/service/2 の場合、redirect_uri パラメーターは http://localhost:8080/service/2 に設定されます。
一部の OIDC プロバイダーでは、すべてのリダイレクト URL の特定のアプリケーション (例: http://localhost:8080/service/callback) に対して redirect_uri が同じ値を持つことを要求します。このような場合は、quarkus.oidc.authentication.redirect-path プロパティーを設定する必要があります。たとえば、quarkus.oidc.authentication.redirect-path=/service/callback の場合、Quarkus は redirect_uri パラメーターを http://localhost:8080/service/callback などの絶対 URL に設定します。これは、現在のリクエスト URL に関係なく同じになります。
quarkus.oidc.authentication.redirect-path が設定されているが、ユーザーが http://localhost:8080/service/callback などの一意のコールバック URL にリダイレクトされた後に元のリクエスト URL を復元する必要がある場合は、quarkus.oidc.authentication.restore-path-after-redirect プロパティーを true に設定します。これにより、http://localhost:8080/service/1 などのリクエスト URL が復元されます。
3.2.1.5. 認証リクエストのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、ユーザーが認証のために OIDC プロバイダーの認可エンドポイントにリダイレクトされるときに、response_type (code に設定)、scope (openid に設定)、client_id、redirect_uri、および state プロパティーのみが HTTP クエリーパラメーターとして OIDC プロバイダーの認可エンドポイントに渡されます。
quarkus.oidc.authentication.extra-params を使用して、さらにプロパティーを追加できます。たとえば、一部の OIDC プロバイダーは、リダイレクト URI のフラグメントの一部として認可コードを返すことを選択する場合があります。これにより認証プロセスが中断されます。次の例は、この問題を回避する方法を示しています。
quarkus.oidc.authentication.extra-params.response_mode=query
quarkus.oidc.authentication.extra-params.response_mode=query
3.2.1.6. 認証エラーレスポンスのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが OIDC 認可エンドポイントにリダイレクトされ、Quarkus アプリケーションを認証し、必要に応じて認可する場合、リダイレクト URI に無効なスコープが含まれている場合など、このリダイレクトリクエストは失敗する可能性があります。このような場合、プロバイダーは、予期される code パラメーターの代わりに、error および error_description パラメーターを使用してユーザーを Quarkus にリダイレクトします。
たとえば、プロバイダーへのリダイレクトに無効なスコープまたはその他の無効なパラメーターが含まれている場合に、これが発生する可能性があります。
このような場合、デフォルトで HTTP 401 エラーが返されます。ただし、よりユーザーフレンドリーな HTML エラーページを返すために、カスタムパブリックエラーエンドポイントを呼び出すように要求できます。これを行うには、次の例に示すように、quarkus.oidc.authentication.error-path プロパティーを設定します。
quarkus.oidc.authentication.error-path=/error
quarkus.oidc.authentication.error-path=/error
プロパティーがスラッシュ (/) 文字で始まり、パスが現在のエンドポイントのベース URI を基準としていることを確認します。たとえば、これが '/error' に設定され、現在のリクエスト URI が https://localhost:8080/callback?error=invalid_scope 場合、最終的なリダイレクトは https://localhost:8080/error?error=invalid_scope に行われます。
ユーザーがこのページにリダイレクトされて再認証されないようにするには、このエラーエンドポイントがパブリックリソースであることを確認します。
3.2.2. 認可データへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
認可に関する情報にはさまざまな方法でアクセスできます。
3.2.2.1. ID とアクセストークンへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
OIDC コード認証メカニズムは、認可コードフロー中に ID トークン、アクセストークン、および更新トークンの 3 つのトークンを取得します。
ID トークンは常に JWT トークンであり、JWT クレームによるユーザー認証を表します。これを使用して、発行 OIDC エンドポイント、ユーザー名、および クレーム と呼ばれるその他の情報を取得できます。IdToken 修飾子を使用して JsonWebToken を注入することで、ID トークンクレームにアクセスできます。
OIDC web-app アプリケーションは通常、アクセストークンを使用して、現在ログインしているユーザーに代わって他のエンドポイントにアクセスします。raw のアクセストークンには次のようにアクセスできます。
AccessTokenCredential は、Quarkus web-app アプリケーションに発行されたアクセストークンが不透明 (バイナリー) で JsonWebToken に解析できない場合、または内部コンテンツがアプリケーションに必要な場合に使用されます。
JsonWebToken および AccessTokenCredential の注入は、@RequestScoped コンテキストと @ApplicationScoped コンテキストの両方でサポートされています。
Quarkus OIDC は、セッション管理 プロセスの一環として、更新トークンを使用して現在の ID とアクセストークンを更新します。
3.2.2.2. ユーザー情報 リンクのコピーリンクがクリップボードにコピーされました!
ID トークンが現在認証されているユーザーに関する十分な情報を提供しない場合は、UserInfo エンドポイントから詳細情報を取得できます。quarkus.oidc.authentication.user-info-required=true プロパティーを設定して、OIDC UserInfo エンドポイントから UserInfo JSON オブジェクトを要求します。
認可コードグラントのレスポンスで返されたアクセストークンを使用して、OIDC プロバイダーの UserInfo エンドポイントにリクエストが送信され、io.quarkus.oidc.UserInfo (単純な jakarta.json.JsonObject ラッパー) オブジェクトが作成されます。io.quarkus.oidc.UserInfo は、SecurityIdentity userinfo 属性として注入またはアクセスできます。
3.2.2.3. OIDC 設定情報へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
現在のテナントの検出された OpenID Connect 設定メタデータ は、io.quarkus.oidc.OidcConfigurationMetadata によって表され、SecurityIdentity configuration-metadata 属性として注入またはアクセスできます。
エンドポイントがパブリックの場合、デフォルトのテナントの OidcConfigurationMetadata が注入されます。
3.2.2.4. トークンクレームと SecurityIdentity ロールのマッピング リンクのコピーリンクがクリップボードにコピーされました!
検証済みトークンから SecurityIdentity ロールにロールをマップする方法は、ベアラートークン の場合と同じです。唯一の違いは、ID トークン がデフォルトでロールのソースとして使用されることです。
Keycloak を使用する場合は、ID トークンに groups クレームが含まれるように microprofile-jwt クライアントスコープを設定します。詳細は、Keycloak サーバー管理ガイド を参照してください。
ただし、OIDC プロバイダーによっては、ロールがアクセストークンまたはユーザー情報に保存される場合があります。
アクセストークンにロールが含まれており、このアクセストークンがダウンストリームエンドポイントに伝播されることを意図していない場合は、quarkus.oidc.roles.source=accesstoken を設定します。
UserInfo がロールのソースである場合は、quarkus.oidc.roles.source=userinfo を設定し、必要に応じて quarkus.oidc.roles.role-claim-path を設定します。
さらに、カスタム SecurityIdentityAugmentor を使用してロールを追加することもできます。詳細は、SecurityIdentity のカスタマイズ を参照してください。HTTP セキュリティーポリシー を使用して、トークン要求から作成された SecurityIdentity ロールをデプロイメント固有のロールにマップすることもできます。
3.2.3. トークンと認証データの有効性の確保 リンクのコピーリンクがクリップボードにコピーされました!
認証プロセスの中核となる部分は、信頼チェーンと情報の有効性を確保することです。これは、トークンを信頼できることを確認することによって行われます。
3.2.3.1. トークンの検証とイントロスペクション リンクのコピーリンクがクリップボードにコピーされました!
OIDC 認可コードフロートークンの検証プロセスは、ベアラートークン認証トークンの検証およびイントロスペクションロジックに従います。詳細は、「Quarkus OpenID Connect (OIDC) ベアラートークン認証」ガイドの トークンの検証とイントロスペクション セクションを参照してください。
Quarkus web-app アプリケーションでは、アクセストークンが現在の Quarkus web-app エンドポイントへのアクセスには使用されず、このアクセストークンを必要とするサービスに伝播されることが意図されているため、デフォルトでは IdToken のみが検証されます。アクセストークンに現在の Quarkus エンドポイント (quarkus.oidc.roles.source=accesstoken) にアクセスするために必要なロールが含まれていることが予想される場合は、それも検証されます。
3.2.3.2. トークンイントロスペクションと UserInfo キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
コードフローアクセストークンは、ロールのソースであると予想されない限り、イントロスペクトされません。ただし、これらは UserInfo を取得するために使用されます。トークンイントロスペクション、UserInfo、またはその両方が必要な場合は、コードフローアクセストークンを使用したリモート呼び出しが 1 回または 2 回発生します。
デフォルトのトークンキャッシュの使用またはカスタムキャッシュ実装の登録の詳細は、トークンのイントロスペクションと UserInfo キャッシュ を参照してください。
3.2.3.3. JSON Web Token のクレームの検証 リンクのコピーリンクがクリップボードにコピーされました!
iss (発行者) クレームを含むクレーム検証の詳細は、JSON Web Token のクレームの検証 セクションを参照してください。これは、ID トークンに適用されますが、web-app アプリケーションがアクセストークンの検証を要求した場合は、JWT 形式のアクセストークンにも適用されます。
3.2.3.4. Proof Key for Code Exchange (PKCE) によるセキュリティー強化 リンクのコピーリンクがクリップボードにコピーされました!
Proof Key for Code Exchange (PKCE) は、認可コードの傍受のリスクを最小限に抑えます。
PKCE は、ブラウザーで実行する SPA スクリプトなどのパブリック OIDC クライアントにとって最も重要ですが、Quarkus OIDC web-app アプリケーションに追加の保護を提供することもできます。PKCE を使用すると、Quarkus OIDC web-app アプリケーションは機密 OIDC クライアントとして機能し、クライアントシークレットを安全に保存し、それを使用してトークンのコードを交換できます。
次の例に示すように、quarkus.oidc.authentication.pkce-required プロパティーと、状態 Cookie 内の PKCE コード検証を暗号化するために必要な 32 文字のシークレットを使用して、OIDC web-app エンドポイントの PKCE を有効にできます。
quarkus.oidc.authentication.pkce-required=true quarkus.oidc.authentication.state-secret=eUk1p7UB3nFiXZGUXi0uph1Y9p34YhBU
quarkus.oidc.authentication.pkce-required=true
quarkus.oidc.authentication.state-secret=eUk1p7UB3nFiXZGUXi0uph1Y9p34YhBU
すでに 32 文字のクライアントシークレットがある場合は、別のシークレットキーを使用する場合を除き、quarkus.oidc.authentication.pkce-secret プロパティーを設定する必要はありません。このシークレットは、設定されていない場合、およびクライアントシークレットの長さが 16 文字未満でクライアントシークレットへのフォールバックが不可能な場合に自動生成されます。
ユーザーが code_challenge クエリーパラメーターを使用して OIDC プロバイダーにリダイレクトされ認証される間、ランダムに生成された PKCE code_verifier を暗号化するには秘密鍵が必要です。code_verifier は、ユーザーが Quarkus にリダイレクトされたときに復号化され、code、クライアントシークレット、およびその他のパラメーターとともにトークンエンドポイントに送信され、コード交換が完了します。code_verifier の SHA256 ダイジェストが認証要求時に提供された code_challenge と一致しない場合、プロバイダーはコード交換に失敗します。
3.2.4. 認証の有効期間の処理と制御 リンクのコピーリンクがクリップボードにコピーされました!
認証のもう 1 つの重要な要件は、ユーザーがリクエストごとに認証する必要なく、セッションの基になるデータが最新であることを確認することです。ログアウトイベントが明示的に要求される状況もあります。Quarkus アプリケーションを保護するための適切なバランスを見つけるには、次の重要なポイントを参考にしてください。
3.2.4.1. Cookie リンクのコピーリンクがクリップボードにコピーされました!
OIDC アダプターは、Cookie を使用してセッション、コードフロー、およびログアウト後の状態を維持します。この状態は、認証データの有効期間を制御する重要な要素です。
重複または異なるルートを持つ保護されたリソースにアクセスするときに同じ Cookie が表示されるようにするには、quarkus.oidc.authentication.cookie-path プロパティーを使用します。以下に例を示します。
-
/index.htmlおよび/web-app/service -
/web-app/service1と/web-app/service2 -
/web-app1/serviceおよび/web-app2/service
デフォルトでは、quarkus.oidc.authentication.cookie-path は / に設定されていますが、必要に応じてこれを /web-app などのより具体的なパスに変更できます。
Cookie パスを動的に設定するには、quarkus.oidc.authentication.cookie-path-header プロパティーを設定します。quarkus.oidc.authentication.cookie-path-header プロパティーを設定します。たとえば、`X-Forwarded-Prefix` HTTP ヘッダーの値を使用して Cookie パスを動的に設定するには、プロパティーを quarkus.oidc.authentication.cookie-path-header=X-Forwarded-Prefix に設定します。
quarkus.oidc.authentication.cookie-path-header が設定されているが、現在のリクエストで設定された HTTP ヘッダーが利用できない場合は、quarkus.oidc.authentication.cookie-path がチェックされます。
アプリケーションが複数のドメインにデプロイされている場合は、セッション Cookie がすべての保護された Quarkus サービスに表示されるように、quarkus.oidc.authentication.cookie-domain プロパティーを設定します。たとえば、次の 2 つのドメインに Quarkus サービスをデプロイしている場合は、quarkus.oidc.authentication.cookie-domain プロパティーを company.net に設定する必要があります。
- https://whatever.wherever.company.net/
- https://another.address.company.net/
3.2.4.2. セッション Cookie とデフォルトの TokenStateManager リンクのコピーリンクがクリップボードにコピーされました!
OIDC CodeAuthenticationMechanism は、デフォルトの io.quarkus.oidc.TokenStateManager インターフェイス実装を使用して、認可コードまたはリフレッシュグラントのレスポンスで返された ID、アクセストークン、およびリフレッシュトークンを暗号化されたセッション Cookie に保持します。
これにより、Quarkus OIDC エンドポイントは完全にステートレスになり、最高のスケーラビリティー結果を達成するにはこのストラテジーに従うことが推奨されます。
トークンを保存するための代替方法は、セッション Cookie とカスタム TokenStateManager セクションを参照してください。これは、特に標準のサーバー側ストレージが特定の要件を満たしていない場合に、トークン状態を管理するためのカスタマイズされたソリューションが必要なユーザーに最適です。
デフォルトの TokenStateManager を設定して、アクセストークンをセッション Cookie に保存しないようにし、ID トークンと更新トークンのみ、または単一の ID トークンのみを保持するようにすることができます。
アクセストークンは、エンドポイントが次のアクションを実行する必要がある場合にのみ必要です。
-
UserInfoを取得します。 - このアクセストークンを使用してダウンストリームサービスにアクセスします
- アクセストークンに関連付けられたロールを使用します。これはデフォルトでチェックされています。
このような場合は、quarkus.oidc.token-state-manager.strategy プロパティーを使用して、トークン状態ストラテジーを次のように設定します。
| 次を行う場合: | プロパティーを以下のように設定します。 |
|---|---|
| ID と更新トークンのみ保存する |
|
| ID トークンのみ保存する |
|
選択したセッション Cookie ストラテジーによってトークンが結合され、4 KB を超える大きなセッション Cookie 値が生成される場合、一部のブラウザーではそのような Cookie サイズを処理できない可能性があります。これは、ID、アクセストークン、および更新トークンが JWT トークンであり、選択されたストラテジーが keep-all-tokens である場合、またはストラテジーが id-refresh-token であるときに ID トークンと更新トークンで発生する可能性があります。この問題を回避するには、quarkus.oidc.token-state-manager.split-tokens=true を設定して、トークンごとに一意のセッショントークンを作成します。
デフォルトの TokenStateManager は、トークンをセッション Cookie に保存する前に暗号化します。次の例は、トークンを分割して暗号化するように設定する方法を示しています。
トークン暗号化シークレットの長さが 32 文字以上である必要があります。このキーが設定されていない場合は、quarkus.oidc.credentials.secret または quarkus.oidc.credentials.jwt.secret のいずれかがハッシュされ、暗号鍵が作成されます。
Quarkus が次のいずれかの認証方法を使用して OIDC プロバイダーに対して認証する場合は、quarkus.oidc.token-state-manager.encryption-secret プロパティーを設定します。
- mTLS
-
秘密の RSA または EC キーを使用して JWT トークンに署名する場合は
private_key_jwt
そうでない場合はランダムなキーが生成されますが、Quarkus アプリケーションがクラウドで実行し、複数の Pod がリクエストを管理している場合は、問題が発生する可能性があります。
quarkus.oidc.token-state-manager.encryption-required=false を設定することで、セッション Cookie でのトークン暗号化を無効化できます。
3.2.4.3. セッション Cookie とカスタムの TokenStateManager リンクのコピーリンクがクリップボードにコピーされました!
トークンをセッション Cookie に関連付ける方法をカスタマイズする場合は、カスタムの io.quarkus.oidc.TokenStateManager 実装を @ApplicationScoped CDI Bean として登録します。
たとえば、トークンをキャッシュクラスターに保持し、キーのみをセッション Cookie に保存したい場合があります。トークンを複数のマイクロサービスノードで利用できるようにする必要がある場合、このアプローチではいくつかの課題が生じる可能性があることに注意してください。
以下は簡単な例です。
暗号化されたセッション Cookie にトークンを保存するデフォルトの TokenStateManager の詳細は、セッション Cookie とデフォルトの TokenStateManager を参照してください。
3.2.4.4. ログアウトと有効期限 リンクのコピーリンクがクリップボードにコピーされました!
認証情報が期限切れになる主な方法は 2 つあります。トークンの有効期限が切れて更新されなかったか、明示的なログアウト操作がトリガーされたかです。
明示的なログアウト操作から始めましょう。
3.2.4.4.1. ユーザーが開始したログアウト リンクのコピーリンクがクリップボードにコピーされました!
ユーザーは、quarkus.oidc.logout.path プロパティーで設定された Quarkus エンドポイントログアウトパスにリクエストを送信することで、ログアウトをリクエストできます。たとえば、エンドポイントアドレスが https://application.com/webapp で、quarkus.oidc.logout.path が /logout に設定されている場合、ログアウト要求は https://application.com/webapp/logout に送信する必要があります。
このログアウトリクエストは、RP-initiated logout を開始します。ユーザーはログアウトするために OIDC プロバイダーにリダイレクトされ、そこでログアウトが本当に意図されたものであるかどうかの確認を求められる場合があります。
ログアウトが完了し、quarkus.oidc.logout.post-logout-path プロパティーが設定されている場合、ユーザーはエンドポイントのログアウト後ページに戻されます。たとえば、エンドポイントアドレスが https://application.com/webapp で、quarkus.oidc.logout.post-logout-path が /signin に設定されている場合、ユーザーは https://application.com/webapp/signin に戻されます。この URI は、OIDC プロバイダーに有効な post_logout_redirect_uri として登録されている必要があることに注意してください。
quarkus.oidc.logout.post-logout-path が設定されている場合、q_post_logout Cookie が作成され、一致する state クエリーパラメーターがログアウトリダイレクト URI に追加され、ログアウトが完了すると OIDC プロバイダーはこの state を返します。Quarkus web-app アプリケーションでは、state クエリーパラメーターが q_post_logout Cookie の値と一致するかどうかを確認することを推奨します。これは、たとえば Jakarta REST フィルターで実行できます。
OpenID Connect マルチテナンシー を使用する場合、Cookie 名が異なることに注意してください。たとえば、tenant_1 ID を持つテナントの場合は q_post_logout_tenant_1 という名前になります。
ログアウトフローを開始するように Quarkus アプリケーションを設定する方法の例を次に示します。
また、quarkus.oidc.authentication.cookie-path をすべてのアプリケーションリソースに共通のパス値 (この例では /) に設定することもできます。詳細は、Cookie セクションを参照してください。
一部の OIDC プロバイダーは、RP 開始ログアウト 仕様をサポートしておらず、OpenID Connect の既知の end_session_endpoint メタデータプロパティーを返しません。ただし、このような OIDC プロバイダーの特定のログアウトメカニズムは、ログアウト URL クエリーパラメーターの命名方法のみが異なるため、Quarkus にとってはこれは問題ではありません。
RP 開始ログアウト 仕様によれば、quarkus.oidc.logout.post-logout-path プロパティーは post_logout_redirect_uri クエリーパラメーターとして表されますが、この仕様をサポートしていないプロバイダーでは認識されません。
この問題を回避するには、quarkus.oidc.logout.post-logout-url-param を使用できます。quarkus.oidc.logout.extra-params を使用して、追加のログアウトクエリーパラメーターをリクエストすることもできます。たとえば、Auth0 でログアウトをサポートする方法は次のとおりです。
3.2.4.4.2. バックチャネルログアウト リンクのコピーリンクがクリップボードにコピーされました!
OIDC プロバイダーは、認証データを使用してすべてのアプリケーションのログアウトを強制できます。これはバックチャネルログアウトと呼ばれます。この場合、OIDC は各アプリケーションから特定の URL を呼び出してログアウトをトリガーします。
OIDC プロバイダーは、バックチャネルログアウト を使用して、ユーザーエージェントをバイパスし、現在ログインしているすべてのアプリケーションから現在のユーザーをログアウトします。
次のようにして、バックチャネルログアウトをサポートするように Quarkus を設定できます。
絶対 back-channel logout URL は、現在のエンドポイント URL に quarkus.oidc.back-channel-logout.path を追加することによって計算されます (例: http://localhost:8080/back-channel-logout)。この URL は、OIDC プロバイダーの管理コンソールで設定する必要があります。
OIDC プロバイダーが現在のログアウトトークンに有効期限要求を設定していない場合は、ログアウトトークンの検証が成功するようにトークンの有効期間プロパティーを設定する必要もあります。たとえば、ログアウトトークンの iat (発行時刻) から 10 秒以上経過しないようにするには、quarkus.oidc.token.age=10S を設定します。
3.2.4.4.3. フロントチャンネルログアウト リンクのコピーリンクがクリップボードにコピーされました!
フロントチャネルログアウト を使用すると、ブラウザーなどのユーザーエージェントから現在のユーザーを直接ログアウトできます。これは バックチャネルログアウト に似ていますが、ログアウト手順は OIDC プロバイダーによってバックグラウンドで実行されるのではなく、ブラウザーなどのユーザーエージェントによって実行されます。このオプションはほとんど使用されません。
以下のように、フロントチャネルログアウトをサポートするように Quarkus を設定できます。
このパスは現在のリクエストのパスと比較され、これらのパスが一致するとユーザーはログアウトされます。
3.2.4.4.4. ローカルログアウト リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが開始したログアウト により、ユーザーは OIDC プロバイダーからログアウトされます。シングルサインオンとして使用する場合は、必要なものではない可能性があります。たとえば、OIDC プロバイダーが Google の場合は、Google とそのサービスからログアウトされます。代わりに、ユーザーはその特定のアプリケーションからログアウトしたいだけかもしれません。もう 1 つのユースケースとしては、OIDC プロバイダーにログアウトエンドポイントがない場合が考えられます。
OidcSession を使用すると、次の例に示すように、ローカルログアウトをサポート (つまり、ローカルセッション Cookie のみをクリア) できます。
3.2.4.4.4.1. ローカルログアウトに OidcSession を使用する リンクのコピーリンクがクリップボードにコピーされました!
io.quarkus.oidc.OidcSession は現在の IdToken のラッパーであり、Local logout の実行、現在のセッションのテナント ID の取得、セッションの有効期限の確認に役立ちます。今後、さらに便利なメソッドが追加される予定です。
3.2.4.5. セッション管理 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、ログアウトは OIDC プロバイダーによって発行された ID トークンの有効期限に基づいて行われます。ID トークンの有効期限が切れると、Quarkus エンドポイントの現在のユーザーセッションは無効になり、ユーザーは認証のために再度 OIDC プロバイダーにリダイレクトされます。OIDC プロバイダーのセッションがまだアクティブな場合、ユーザーは認証情報を再度入力する必要なく自動的に再認証されます。
quarkus.oidc.token.refresh-expired プロパティーを有効にすると、現在のユーザーセッションを自動的に延長できます。true に設定すると、現在の ID トークンの有効期限が切れたときに、リフレッシュトークングラントを使用して、ID トークンだけでなくアクセストークンと更新トークンもリフレッシュされます。
keycloak.js などの OIDC プロバイダースクリプトが認可コードフローを管理する サービスアプリケーション用の単一ページアプリケーション がある場合、そのスクリプトは SPA 認証セッションの有効期間も制御します。
Quarkus OIDC web-app アプリケーションを使用する場合は、Quarkus OIDC コード認証メカニズムによってユーザーセッションの有効期間が管理されます。
更新トークンを使用するには、セッション Cookie の有効期間を慎重に設定する必要があります。セッションの有効期間は、ID トークンの有効期間よりも長く、更新トークンの有効期間と近いか等しい必要があります。
セッションの有効期間は、現在の ID トークンの有効期間の値と、quarkus.oidc.authentication.session-age-extension プロパティーおよび quarkus.oidc.token.lifespan-grace プロパティーの値を加算して計算します。
必要に応じて、quarkus.oidc.authentication.session-age-extension プロパティーのみを使用して、セッションの有効期間を大幅に延長します。quarkus.oidc.token.lifespan-grace プロパティーは、小さなクロックのずれを考慮する場合にのみ使用します。
現在認証されているユーザーが保護された Quarkus エンドポイントに戻り、セッション Cookie に関連付けられた ID トークンの有効期限が切れている場合、デフォルトでは、ユーザーは再認証のために OIDC 認可エンドポイントに自動的にリダイレクトされます。ユーザーとこの OIDC プロバイダー間のセッションがまだアクティブな場合、OIDC プロバイダーはユーザーに再度チャレンジする可能性があります。これは、セッションが ID トークンよりも長く続くように設定されている場合に発生する可能性があります。
quarkus.oidc.token.refresh-expired が true に設定されている場合、期限切れの ID トークン (およびアクセストークン) は、最初の認可コードグラントのレスポンスで返されたリフレッシュトークンを使用して更新されます。この更新トークンも、このプロセスの一部としてリサイクル (更新) される可能性があります。その結果、新しいセッション Cookie が作成され、セッションが延長されます。
ユーザーがあまりアクティブでない場合は、quarkus.oidc.authentication.session-age-extension プロパティーを使用して、期限切れの ID トークンを処理できます。ID トークンの有効期限が切れると、Cookie の有効期間が経過するため、次のユーザーリクエスト時にセッション Cookie が Quarkus エンドポイントに返されない可能性があります。Quarkus は、このリクエストが最初の認証リクエストであると想定します。quarkus.oidc.authentication.session-age-extension を、ほとんどアクティブでないユーザー向けに、またセキュリティーポリシーに従って、適切な 長さに設定します。
さらに一歩進んで、期限切れが近づいている ID トークンまたはアクセストークンを事前に更新することもできます。quarkus.oidc.token.refresh-token-time-skew を、更新を予測する値に設定します。現在のユーザーリクエスト中に、現在の ID トークンがこの quarkus.oidc.token.refresh-token-time-skew 内に期限切れになると計算されると、トークンは更新され、新しいセッション Cookie が作成されます。このプロパティーは、ID トークンの有効期間よりも短い値に設定する必要があります。この有効期間の値に近いほど、ID トークンの更新頻度が高くなります。
単純な JavaScript 関数を使用して Quarkus エンドポイントに定期的に ping を送信し、ユーザーアクティビティーをエミュレートすることで、このプロセスをさらに最適化できます。これにより、ユーザーが再認証される必要がある時間枠が最小限に抑えられます。
ユーザーセッションを無期限に延長することはできません。有効期限が切れた ID トークンを持つ再ログインユーザーは、更新トークンの有効期限が切れると、OIDC プロバイダーエンドポイントで再認証する必要があります。
3.2.5. GitHub および非 OIDC OAuth2 プロバイダーとの統合 リンクのコピーリンクがクリップボードにコピーされました!
GitHub または LinkedIn などの一部の周知のプロバイダーは、OpenID Connect プロバイダーではなく、authorization code flow をサポートする OAuth2 プロバイダーです。たとえば、GitHub OAuth2 や LinkedIn OAuth2 などです。OIDC は OAuth2 上に構築されていることに注意してください。
OIDC プロバイダーと OAuth2 プロバイダーの主な違いは、OIDC プロバイダーが、OAuth2 プロバイダーによって返される標準の認可コードフローの access トークンと refresh トークンに加えて、ユーザー認証を表す ID Token を返すことです。
GitHub などの OAuth2 プロバイダーは IdToken を返さず、ユーザー認証は暗黙的であり、access トークンによって間接的に表されます。この access トークンは、認証されたユーザーに代わって現在の Quarkus web-app アプリケーションが一部のデータにアクセスすることを、認証されたユーザーが認可していることを表します。
OIDC の場合は、認証の有効性の証明として ID トークンを検証しますが、OAuth2 の場合はアクセストークンを検証します。これは、アクセストークンを要求し、通常はユーザー情報を返すエンドポイントを後で呼び出すことによって実行されます。このアプローチは OIDC UserInfo アプローチに似ており、UserInfo はユーザーではなく Quarkus OIDC によって取得されます。
たとえば、GitHub を使用する場合、Quarkus エンドポイントは access トークンを取得できます。これにより、Quarkus エンドポイントは現在のユーザーの GitHub プロファイルをリクエストできます。
このような OAuth2 サーバーとの統合をサポートするには、quarkus-oidc を少し異なる方法で設定して、IdToken なしで認可コードフローの応答を許可する必要があります (quarkus.oidc.authentication.id-token-required=false)。
IdToken なしで認可コードフローをサポートするようにエクステンションを設定しても、quarkus-oidc の動作方法を標準化するために内部 IdToken が生成されます。IdToken を使用すると、認証セッションをサポートし、リクエストごとにユーザーが GitHub などのプロバイダーにリダイレクトされるのを回避できます。この場合、セッションの有効期間は 5 分に設定されていますが、セッション管理 セクションで説明されているように、さらに延長することができます。
これにより、複数の OIDC プロバイダーをサポートするアプリケーションの処理が簡素化されます。
次のステップは、返されたアクセストークンが有用であり、現在の Quarkus エンドポイントに対して有効であることを確認することです。最初の方法は、プロバイダーがそのようなエンドポイントを提供している場合、quarkus.oidc.introspection-path を設定して OAuth2 プロバイダーのイントロスペクションエンドポイントを呼び出すことです。この場合、quarkus.oidc.roles.source=accesstoken を使用して、アクセストークンをロールのソースとして使用できます。イントロスペクションエンドポイントが存在しない場合、UserInfo は少なくともアクセストークンを検証することから、代わりにプロバイダーから UserInfo のリクエストを試行できます。これを行うには、quarkus.oidc.token.verify-access-token-with-user-info=true を指定します。また、quarkus.oidc.user-info-path プロパティーを、ユーザー情報を取得する URL エンドポイント (またはアクセストークンによって保護されたエンドポイント) に設定する必要があります。GitHub の場合、イントロスペクションエンドポイントがないため、UserInfo をリクエストする必要があります。
UserInfo が必要な場合、リクエストごとにリモート呼び出しが実行されます。したがって、UserInfo データをキャッシュすることを推奨します。詳細は、「OpenID Connect (OIDC) ベアラートークン認証」ガイドの トークンイントロスペクションと UserInfo キャッシュ セクションを参照してください。
あるいは、quarkus.oidc.cache-user-info-in-idtoken=true プロパティーを使用して、UserInfo が内部で生成された IdToken に埋め込まれるようにリクエストすることを推奨します。このアプローチの利点は、デフォルトでは、キャッシュされた UserInfo 状態がエンドポイントに保持されず、代わりにセッション Cookie に保存されることです。UserInfo に機密データが含まれている場合は、IdToken の暗号化も検討してください。詳細は、TokenStateManager を使用してトークンを暗号化する を参照してください。
OAuth2 サーバーは、周知の設定エンドポイントをサポートしていない可能性があります。この場合、検出を無効にして、認可、トークン、イントロスペクション、および UserInfo エンドポイントパスを手動で設定する必要があります。
Apple、Facebook、GitHub、Google、Microsoft、Spotify、Twitter などのよく知られた OIDC または OAuth2 プロバイダーの場合、Quarkus は quarkus.oidc.provider プロパティーを使用してアプリケーションの設定を大幅に簡素化できます。GitHub OAuth アプリケーションを作成した 後、quarkus-oidc を GitHub と統合する方法は次のとおりです。Quarkus エンドポイントを次のように設定します。
他のよく知られているプロバイダーの設定の詳細は、OpenID Connect プロバイダー を参照してください。
これは、GET http://localhost:8080/github/userinfo を使用して現在認証されているユーザーのプロファイルを返し、個々の UserInfo プロパティーとしてアクセスするためのエンドポイントに必要なすべてです。
OpenID Connect Multi-Tenancy を使用して複数のソーシャルプロバイダー (たとえば、IdToken を返す OIDC プロバイダーである Google と、IdToken を返さず UserInfo へのアクセスのみを許可する OAuth2 プロバイダーである GitHub) をサポートする場合は、Google フローと GitHub フローの両方で、注入された SecurityIdentity のみを使用してエンドポイントを動作させることができます。GitHub フローがアクティブで、内部で生成された IdToken で作成されたプリンシパルが UserInfo ベースのプリンシパルに置き換えられる場合は、SecurityIdentity の簡単なオーグメンテーションが必要になります。
これで、ユーザーが Google または GitHub を使用してアプリケーションにサインインするときに、次のコードが機能するようになります。
おそらく、より簡単な代替案としては、@IdToken JsonWebToken と UserInfo の両方を注入し、IdToken を返すプロバイダーを処理するときに JsonWebToken を使用し、IdToken を返さないプロバイダーでは UserInfo を使用することです。
GitHub OAuth アプリケーション設定に入力するコールバックパスが、GitHub 認証とアプリケーション認可が成功した後にユーザーをリダイレクトするエンドポイントパスと一致していることを確認する必要があります。この場合、http:localhost:8080/github/userinfo に設定する必要があります。
3.2.6. 重要な認証イベントをリッスンする リンクのコピーリンクがクリップボードにコピーされました!
重要な OIDC 認証イベントを監視する @ApplicationScoped Bean を登録できます。ユーザーが初めてログインしたり、再認証したり、セッションを更新したりすると、リスナーが更新されます。今後、さらに多くのイベントが報告される可能性があります。以下に例を示します。
セキュリティーのヒントと裏技ガイドの セキュリティーイベントの監視 セクションで説明されているように、他のセキュリティーイベントをリッスンすることができます。
3.2.7. ダウンストリームサービスへのトークンの伝播 リンクのコピーリンクがクリップボードにコピーされました!
ダウンストリームサービスへの認可コードフローアクセストークンの伝播に関する詳細は、トークンの伝播 セクションを参照してください。
3.3. 統合に関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
OIDC によって保護されたアプリケーションは、シングルページアプリケーションから呼び出すことができる環境に統合されます。よく知られている OIDC プロバイダーと連携し、HTTP リバースプロキシーの背後で実行され、外部および内部アクセスを必要とするなど、さまざまな要件を満たす必要があります。
このセクションでは、これらの考慮事項を説明します。
3.3.1. シングルページアプリケーション リンクのコピーリンクがクリップボードにコピーされました!
シングルページアプリケーション (SPA) を実装する場合は、「OpenID Connect (OIDC) ベアラートークン認証」ガイドの シングルページアプリケーション セクションで提案されている方法を参照してください。
Quarkus Web アプリケーションで Fetch または XMLHttpRequest (XHR) などの SPA および JavaScript API を使用する場合は、Quarkus からのリダイレクト後にユーザーが認証される認証エンドポイントに対して、OIDC プロバイダーが Cross-Origin Resource Sharing (CORS) をサポートしていない可能性があることに注意してください。Quarkus アプリケーションと OIDC プロバイダーが異なる HTTP ドメイン、ポート、またはその両方でホストされている場合は、認証に失敗します。
このような場合は、quarkus.oidc.authentication.java-script-auto-redirect プロパティーを false に設定します。これにより、Quarkus は 499 ステータスコードと OIDC 値を含む WWW-Authenticate ヘッダーを返すように指示されます。
quarkus.oidc.authentication.java-script-auto-redirect プロパティーが false に設定されている場合に 499 ステータスコードが返されるようにするには、ブラウザースクリプトで現在のリクエストを JavaScript リクエストとして識別するヘッダーを設定する必要があります。
スクリプトエンジンがエンジン固有のリクエストヘッダー自体を設定する場合は、カスタム quarkus.oidc.JavaScriptRequestChecker Bean を登録できます。これにより、現在のリクエストが JavaScript リクエストであるかどうかが Quarkus に通知されます。たとえば、JavaScript エンジンが HX-Request: true などのヘッダーを設定する場合は、次のようにチェックできます。
ステータスコード 499 の場合は、最後にリクエストされたページを再読み込みします。
それ以外の場合は、ブラウザースクリプトを更新して、X-Requested-With ヘッダーに JavaScript 値を設定し、ステータスコード 499 の場合は最後にリクエストされたページを再読み込みする必要もあります。
以下に例を示します。
3.3.2. Cross-Origin Resource Sharing リンクのコピーリンクがクリップボードにコピーされました!
別のドメインで実行されているシングルページアプリケーションからこのアプリケーションを使用する予定の場合は、Cross-Origin Resource Sharing (CORS) を設定する必要があります。詳細は、"Cross-origin resource sharing" の CORS filter セクションを参照してください。
3.3.3. リバースプロキシーの背後で Quarkus アプリケーションを実行する リンクのコピーリンクがクリップボードにコピーされました!
Quarkus アプリケーションがリバースプロキシー、ゲートウェイ、またはファイアウォールの背後で実行している場合は、HTTP Host ヘッダーが内部 IP アドレスにリセットされ、HTTPS 接続が終了するなどして、OIDC 認証メカニズムが影響を受ける可能性があります。たとえば、認可コードフローの redirect_uri パラメーターが、予期される外部ホストではなく内部ホストに設定されている場合があります。
このような場合は、プロキシーによって転送された元のヘッダーを認識するように Quarkus を設定する必要があります。詳細は、Vert.x ドキュメントの Running behind a reverse proxy セクションを参照してください。
たとえば、Quarkus エンドポイントが Kubernetes Ingress の背後にあるクラスターで実行している場合は、計算された redirect_uri パラメーターが内部エンドポイントアドレスを指している可能性があるため、OIDC プロバイダーからこのエンドポイントへのリダイレクトが機能しない可能性があります。この問題は、Kubernetes Ingress によって外部エンドポイントアドレスを表すように設定された X-ORIGINAL-HOST を使用する次の設定を使用して解決できます。
quarkus.http.proxy.proxy-address-forwarding=true quarkus.http.proxy.allow-forwarded=false quarkus.http.proxy.enable-forwarded-host=true quarkus.http.proxy.forwarded-host-header=X-ORIGINAL-HOST
quarkus.http.proxy.proxy-address-forwarding=true
quarkus.http.proxy.allow-forwarded=false
quarkus.http.proxy.enable-forwarded-host=true
quarkus.http.proxy.forwarded-host-header=X-ORIGINAL-HOST
quarkus.oidc.authentication.force-redirect-https-scheme プロパティーは、Quarkus アプリケーションが SSL 終了リバースプロキシーの背後で実行している場合にも使用できます。
3.3.4. OIDC プロバイダーへの外部および内部アクセス リンクのコピーリンクがクリップボードにコピーされました!
OIDC プロバイダーの外部からアクセス可能な認可、ログアウト、およびその他のエンドポイントは、quarkus.oidc.auth-server-url 内部 URL を基準として自動検出された URL または設定された URL とは異なる HTTP(S) URL を持つことができます。このような場合、エンドポイントは発行者の検証の失敗を報告し、外部からアクセス可能な OIDC プロバイダーエンドポイントへのリダイレクトが失敗する可能性があります。
Keycloak を使用する場合は、KEYCLOAK_FRONTEND_URL システムプロパティーを外部からアクセス可能なベース URL に設定して起動します。他の OIDC プロバイダーと連携する場合は、プロバイダーのドキュメントを確認してください。
3.4. OIDC SAML アイデンティティーブローカー リンクのコピーリンクがクリップボードにコピーされました!
アイデンティティープロバイダーが OpenID Connect を実装しておらず、従来の XML ベースの SAML2.0 SSO プロトコルのみを実装している場合は、quarkus-oidc が OIDC アダプターとして使用されるのと同様に、Quarkus を SAML 2.0 アダプターとして使用することはできません。
ただし、Keycloak、Okta、Auth0、Microsoft ADFS などの多くの OIDC プロバイダーは、OIDC から SAML 2.0 へのブリッジを提供しています。OIDC プロバイダーで SAML 2.0 プロバイダーへのアイデンティティーブローカー接続を作成し、quarkus-oidc を使用してこの SAML 2.0 プロバイダーに対してユーザーを認証し、OIDC プロバイダーが OIDC と SAML 2.0 の通信を調整することができます。Quarkus エンドポイントに関しては、同じ Quarkus Security、OIDC API、@Authenticated、SecurityIdentity などのアノテーションなどを引き続き使用できます。
たとえば、Okta が SAML 2.0 プロバイダーであり、Keycloak が OIDC プロバイダーであるとします。ここでは、Keycloak をOkta SAML 2.0 プロバイダーと仲介するように設定する方法を説明する一般的なシーケンスを示します。
まず、Okta Dashboard/Applications に新しい SAML2 インテグレーションを作成します。
たとえば、OktaSaml という名前を付けます。
次に、Keycloak SAML ブローカーエンドポイントを指すように設定します。この時点で、Keycloak レルムの名前 (例: quarkus) を知っておく必要があります。Keycloak SAML ブローカーのエイリアスが saml であると仮定すると、エンドポイントアドレスを http:localhost:8081/realms/quarkus/broker/saml/endpoint として入力します。サービスプロバイダー (SP) エンティティー ID を http:localhost:8081/realms/quarkus として入力します。ここで、http://localhost:8081 は Keycloak ベースアドレス、saml はブローカーエイリアスです。
次に、この SAML インテグレーションを保存し、そのメタデータ URL をメモします。
次に、Keycloak に SAML プロバイダーを追加します。
まず、通常どおりに、新しいレルムを作成するか、既存のレルムを Keycloak にインポートします。この場合、レルム名は quarkus にする必要があります。
次に、quarkus レルムのプロパティーで、Identity Providers に移動し、新しい SAML プロバイダーを追加します。
エイリアスは saml に設定され、Redirect URI は http:localhost:8081/realms/quarkus/broker/saml/endpoint、Service provider entity ID は http:localhost:8081/realms/quarkus であることに注意してください。これらは、前の手順で Okta SAML 統合を作成するときに入力した値と同じです。
最後に、前の手順の最後に書き留めた Okta SAML 統合メタデータ URL を指すように Service entity descriptor を設定します。
次に、必要に応じて、Authentication/browser/Identity Provider Redirector config に移動し、Alias と Default Identity Provider の両方のプロパティーを saml に設定して、この Keycloak SAML プロバイダーをデフォルトプロバイダーとして登録できます。デフォルトのプロバイダーとして設定しない場合は、認証時に Keycloak は次の 2 つのオプションを提供します。
- SAML プロバイダーで認証する
- 名前とパスワードで Keycloak に直接認証する
ここで、Quarkus OIDC web-app アプリケーションを、Keycloak quarkus レルム quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus を指すように設定します。次に、Keycloak OIDC および Okta SAML 2.0 プロバイダーによって提供される OIDC から SAML へのブリッジを使用して、Quarkus ユーザーを Okta SAML 2.0 プロバイダーに認証する準備が整います。
Keycloak の場合と同様に、他の OIDC プロバイダーを設定して SAML ブリッジを提供することもできます。
3.5. テスト リンクのコピーリンクがクリップボードにコピーされました!
別の OIDC のようなサーバーへの認証に関しては、テストが困難になることがよくあります。Quarkus は、モックから OIDC プロバイダーのローカル実行まで、さまざまなオプションを提供します。
まず、テストプロジェクトに次の依存関係を追加します。
Maven を使用:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("net.sourceforge.htmlunit:htmlunit") testImplementation("io.quarkus:quarkus-junit5")testImplementation("net.sourceforge.htmlunit:htmlunit") testImplementation("io.quarkus:quarkus-junit5")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5.1. Wiremock リンクのコピーリンクがクリップボードにコピーされました!
次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-oidc-server</artifactId> <scope>test</scope> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-oidc-server</artifactId> <scope>test</scope> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
testImplementation("io.quarkus:quarkus-test-oidc-server")testImplementation("io.quarkus:quarkus-test-oidc-server")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
REST テストエンドポイントを準備し、application.properties を設定します。以下に例を示します。
keycloak.url is set by OidcWiremockTestResource
# keycloak.url is set by OidcWiremockTestResource
quarkus.oidc.auth-server-url=${keycloak.url}/realms/quarkus/
quarkus.oidc.client-id=quarkus-web-app
quarkus.oidc.credentials.secret=secret
quarkus.oidc.application-type=web-app
最後に、次のようなテストコードを記述します。
OidcWiremockTestResource は、alice および admin ユーザーを認識します。ユーザー alice には、デフォルトで user ロールのみが割り当てられます。これは、quarkus.test.oidc.token.user-roles システムプロパティーを使用してカスタマイズできます。ユーザー admin には、デフォルトで user ロールと admin ロールがあります。これは、quarkus.test.oidc.token.admin-roles システムプロパティーを使用してカスタマイズできます。
さらに、OidcWiremockTestResourceは、トークンの発行者と audience を https://service.example.com に設定します。これは、quarkus.test.oidc.token.issuer および quarkus.test.oidc.token.audience システムプロパティーを使用してカスタマイズできます。
OidcWiremockTestResource は、すべての OIDC プロバイダーをエミュレートするために使用できます。
3.5.2. Dev Services for Keycloak リンクのコピーリンクがクリップボードにコピーされました!
Keycloak に対する結合テストには、Dev Services for Keycloak の使用が推奨されます。Dev Services for Keycloak がテストコンテナーを起動して初期化します。これにより、quarkus レルム、quarkus-app クライアント (secret シークレット) が作成され、alice (admin ロールと user ロール) および bob (user ロール) ユーザーが追加されます。これらのプロパティーはすべてカスタマイズできます。
まず、application.properties を準備します。完全に空の application.properties ファイルから開始できます。これは、Dev Services for Keycloak は、実行中のテストコンテナーを指す quarkus.oidc.auth-server-url および quarkus.oidc.client-id=quarkus-app および quarkus.oidc.credentials.secret=secret を登録します。
ただし、必要な quarkus-oidc プロパティーがすべてすでに設定されている場合は、コンテナーを起動するために、Dev Services for Keycloak の prod プロファイルに quarkus.oidc.auth-server-url を関連付けるだけで済みます。以下に例を示します。
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
テストを実行する前にカスタムレルムファイルを Keycloak にインポートする必要がある場合は、次のようにして Dev Services for Keycloak を設定できます。
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus quarkus.keycloak.devservices.realm-path=quarkus-realm.json
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.keycloak.devservices.realm-path=quarkus-realm.json
最後に、Wiremock セクションで説明されているのと同じ方法でテストコードを記述します。唯一の違いは、@QuarkusTestResource が不要になったことです。
@QuarkusTest
public class CodeFlowAuthorizationTest {
}
@QuarkusTest
public class CodeFlowAuthorizationTest {
}
3.5.3. TestSecurity アノテーション リンクのコピーリンクがクリップボードにコピーされました!
@TestSecurity および @OidcSecurity アノテーションを使用して、次のインジェクションのいずれか、または 4 つすべてに依存する web-app アプリケーションエンドポイントコードをテストできます。
-
ID
JsonWebToken -
JsonWebTokenへのアクセス -
UserInfo -
OidcConfigurationMetadata
詳細は、注入された JsonWebToken で TestingSecurity を使用する を参照してください。
3.5.4. ログエラーの確認 リンクのコピーリンクがクリップボードにコピーされました!
トークン検証エラーの詳細を確認するには、io.quarkus.oidc.runtime.OidcProvider TRACE レベルのロギングを有効にする必要があります。
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE
OidcProvider クライアント初期化エラーの詳細を表示するには、io.quarkus.oidc.runtime.OidcRecorder TRACE レベルのロギングを有効にします。
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".level=TRACE quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcRecorder".min-level=TRACE
quarkus dev コンソールから j と入力して、アプリケーションのグローバルログレベルを変更します。
3.6. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第4章 OpenID Connect (OIDC) 認可コードフローを使用した Web アプリケーションの保護 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus OIDC エクステンションを備えた Quarkus OpenID Connect (OIDC) 認可コードフローメカニズムを使用してアプリケーションの HTTP エンドポイントを保護し、堅牢な認証と認可を実現する方法を説明します。
詳細は、Web アプリケーションを保護するための OIDC コードフローメカニズム を参照してください。
Apple、Facebook、GitHub、Google、Mastodon、Microsoft、Twitch、Twitter (X)、Spotify などのよく知られたソーシャルプロバイダーを Quarkus OIDC で使用する方法は、Configuring well-known OpenID Connect providers を参照してください。Quarkus の認証メカニズム も参照してください。
OIDC ベアラートークン認証を使用してサービスアプリケーションを保護する場合は、OIDC ベアラートークン認証 を参照してください。
4.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAV_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.9.6
- 動作するコンテナーランタイム (Docker または Podman)
- オプションで使用する場合は Quarkus CLI
- ネイティブ実行可能ファイル (ネイティブコンテナービルドを使用する場合は Docker) をビルドする必要がある場合は、オプションで Mandrel または GraalVM がインストールされ、適切に設定されている
4.2. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
この例では、1 つのページを持つシンプルな Web アプリケーションを構築します。
-
/index.html
このページは保護されており、認証されたユーザーのみがアクセスできます。
4.3. ソリューション リンクのコピーリンクがクリップボードにコピーされました!
次のセクションの指示に従って、アプリケーションを段階的に作成します。あるいは、完成した例に直接進むこともできます。
git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.8 コマンドを実行して、Git リポジトリーをクローンします。または、アーカイブ をダウンロードします。
ソリューションは、security-openid-connect-web-authentication-quickstart ディレクトリー にあります。
4.4. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
まず、新しいプロジェクトが必要です。次のコマンドを実行して新しいプロジェクトを作成します。
Quarkus CLI を使用:
quarkus create app org.acme:security-openid-connect-web-authentication-quickstart \ --extension='resteasy-reactive,oidc' \ --no-code cd security-openid-connect-web-authentication-quickstartquarkus create app org.acme:security-openid-connect-web-authentication-quickstart \ --extension='resteasy-reactive,oidc' \ --no-code cd security-openid-connect-web-authentication-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-web-authentication-quickstart")。
Quarkus プロジェクトがすでに設定されている場合は、プロジェクトベースディレクトリーで次のコマンドを実行して、oidc エクステンションをプロジェクトに追加できます。
Quarkus CLI を使用:
quarkus extension add oidc
quarkus extension add oidcCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用:
./mvnw quarkus:add-extension -Dextensions='oidc'
./mvnw quarkus:add-extension -Dextensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
./gradlew addExtension --extensions='oidc'
./gradlew addExtension --extensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これにより、ビルドファイルに次の依存関係が追加されます。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency>
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
implementation("io.quarkus:quarkus-oidc")implementation("io.quarkus:quarkus-oidc")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5. アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
認可コードグラントのレスポンスで返されるすべてのトークンが注入された単純な Jakarta REST リソースを記述してみましょう。
このエンドポイントには、ID、アクセス、および更新トークンが注入されています。ID トークンからの preferred_username クレーム、アクセストークンからの scope クレーム、および更新トークンの可用性ステータスを返します。
エンドポイントが ID トークンを使用して現在認証されているユーザーと対話する必要がある場合、またはアクセストークンを使用してこのユーザーに代わってダウンストリームサービスにアクセスする必要がある場合にのみ、トークンを注入する必要があります。
詳細は、リファレンスガイドの アクセス ID とアクセストークン セクションを参照してください。
4.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
OIDC エクステンションを使用すると、src/main/resources ディレクトリーの application.properties ファイルを使用して設定を定義できます。
これは、アプリケーションへの認証を有効にするときに使用できる最も単純な設定です。
quarkus.oidc.client-id プロパティーは OIDC プロバイダーによって発行された client_id を参照し、quarkus.oidc.credentials.secret プロパティーはクライアントシークレットを設定します。
quarkus.oidc.application-type プロパティーは web-app に設定され、ユーザーが認証のために OIDC プロバイダーにリダイレクトされるように、OIDC 認可コードフローを有効にすることを Quarkus に通知します。
最後に、保護するパスを Quarkus に伝えるために、quarkus.http.auth.permission.authenticated 権限が設定されます。この場合、すべてのパスは、authenticated ユーザーのみがアクセスできるようにするポリシーによって保護されます。詳細は、セキュリティー認可ガイド を参照してください。
4.7. Keycloak サーバーの起動と設定 リンクのコピーリンクがクリップボードにコピーされました!
Keycloak サーバーを起動するには、Docker を使用して次のコマンドを実行します。
docker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
docker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
ここで、keycloak.version は 24.0.0 以降に設定されています。
Keycloak サーバーには localhost:8180 からアクセスできます。
Keycloak 管理コンソールにアクセスするには、admin ユーザーとしてログインします。ユーザー名とパスワードは両方とも admin です。
新しいレルムを作成するには、レルム設定ファイル をインポートします。新しいレルムの作成および設定 方法の詳細は、Keycloak のドキュメントを参照してください。
4.8. 開発モードと JVM モードでのアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
開発モードでアプリケーションを実行するには、次を使用します。
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
開発モードでアプリケーションを試した後、標準の 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
4.9. アプリケーションのネイティブモードでの実行 リンクのコピーリンクがクリップボードにコピーされました!
この同じデモはネイティブコードにコンパイルできます。変更は必要ありません。
これは、生成されたバイナリーにランタイムテクノロジーが含まれ、最小限のリソースで実行するように最適化されているため、実稼働環境に JVM をインストールする必要がなくなることを意味します。
コンパイルには時間がかかるため、この手順はデフォルトでオフになっています。ネイティブビルドを有効にすることで再度ビルドできます。
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.package.type=native
./gradlew build -Dquarkus.package.type=nativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
しばらくすると、このバイナリーを直接実行できるようになります。
./target/security-openid-connect-web-authentication-quickstart-runner
./target/security-openid-connect-web-authentication-quickstart-runner
4.10. アプリケーションをテストする リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションをテストするには、ブラウザーを開いて次の URL にアクセスします。
すべてが想定どおりに動作する場合、認証のために Keycloak サーバーにリダイレクトされます。
アプリケーションを認証するには、Keycloak ログインページで次の認証情報を入力します。
- ユーザー名: alice
- パスワード: alice
Login ボタンをクリックすると、アプリケーションにリダイレクトされ、セッション cookie が作成されます。
このデモのセッションは短期間有効であり、ページを更新するたびに再認証を求められます。セッションタイムアウトを増やす方法は、Keycloak の セッションタイムアウト のドキュメントを参照してください。たとえば、開発モードで Dev Services for Keycloak を使用する場合は、Keycloak Admin リンクをクリックして、開発 UI から直接 Keycloak Admin コンソールにアクセスできます。
Dev Services for Keycloak に依存する結合テストの作成に関する詳細は、Dev Services for Keycloak セクションを参照してください。
4.11. まとめ リンクのコピーリンクがクリップボードにコピーされました!
OIDC 認可コードフローメカニズムを設定して使用し、アプリケーションの HTTP エンドポイントを保護およびテストする方法を説明しました。このチュートリアルを完了したら、OIDC ベアラートークン認証 と その他の認証メカニズム を調べてください。
4.12. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
- Quarkus Security の概要
- Web アプリケーションを保護するための OIDC コードフローメカニズム
- よく知られている OpenID Connect プロバイダーの設定
- OpenID Connect および OAuth2 クライアントとフィルターのリファレンスガイド
- Dev Services for Keycloak
- SmallRye JWT Build で JWT トークンに署名して暗号化する
- OpenID Connect、SmallRye JWT、OAuth2 認証メカニズムの選択
- Keycloak ドキュメント
- Protect Quarkus web application by using Auth0 OpenID Connect provider
- OpenID Connect
- JSON Web Token
第5章 OpenID Connect (OIDC) マルチテナントの使用 リンクのコピーリンクがクリップボードにコピーされました!
このガイドでは、OpenID Connect (OIDC) アプリケーションがマルチテナントをサポートして、単一のアプリケーションから複数のテナントにサービスを提供する方法を説明します。これらのテナントは、同じ OIDC プロバイダー内の異なるレルムまたはセキュリティードメイン、あるいは異なる OIDC プロバイダーである場合もあります。
SaaS 環境など、同じアプリケーションから複数の顧客にサービスを提供する場合、各顧客は個別のテナントとして機能します。アプリケーションでマルチテナントサポートを有効にすると、Keycloak や Google などの異なる OIDC プロバイダーに対して認証する場合でも、テナントごとに異なる認証ポリシーをサポートできます。
ベアラートークン認可を使用してテナントを認可するには、OpenID Connect (OIDC) ベアラートークン認証 ガイドを参照してください。
OIDC 認可コードフローを使用してテナントを認証および認可するには、Web アプリケーションを保護するための OpenID Connect 認可コードフローメカニズム ガイドを参照してください。
また、OpenID Connect (OIDC) 設定プロパティー リファレンスガイドも参照してください。
5.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAV_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.9.6
- 動作するコンテナーランタイム (Docker または Podman)
- オプションで使用する場合は Quarkus CLI
- ネイティブ実行可能ファイル (ネイティブコンテナービルドを使用する場合は Docker) をビルドする必要がある場合は、オプションで Mandrel または GraalVM がインストールされ、適切に設定されている
- jq tool
5.2. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
この例では、次の 2 つのリソースメソッドをサポートする非常にシンプルなアプリケーションをビルドします。
-
/{tenant}
このリソースは、認証されたユーザーと現在のテナントについて、OIDC プロバイダーによって発行された ID トークンから取得した情報を返します。
-
/{tenant}/bearer
このリソースは、認証されたユーザーと現在のテナントについて、OIDC プロバイダーによって発行された Access Token から取得した情報を返します。
5.3. ソリューション リンクのコピーリンクがクリップボードにコピーされました!
完全に理解するために、次の手順に従ってアプリケーションをビルドすることを推奨します。
あるいは、完成した例から始める場合は、Git リポジトリーをクローンします (git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.8)。または、アーカイブ をダウンロードします。
ソリューションは、security-openid-connect-multi-tenancy-quickstart ディレクトリー にあります。
5.4. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
まず、新しいプロジェクトが必要です。次のコマンドで新しいプロジェクトを作成します。
Quarkus CLI を使用:
quarkus create app org.acme:security-openid-connect-multi-tenancy-quickstart \ --extension='oidc,resteasy-reactive-jackson' \ --no-code cd security-openid-connect-multi-tenancy-quickstartquarkus create app org.acme:security-openid-connect-multi-tenancy-quickstart \ --extension='oidc,resteasy-reactive-jackson' \ --no-code cd security-openid-connect-multi-tenancy-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-multi-tenancy-quickstart")。
Quarkus プロジェクトがすでに設定されている場合は、プロジェクトベースディレクトリーで次のコマンドを実行して、oidc エクステンションをプロジェクトに追加します。
Quarkus CLI を使用:
quarkus extension add oidc
quarkus extension add oidcCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用:
./mvnw quarkus:add-extension -Dextensions='oidc'
./mvnw quarkus:add-extension -Dextensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
./gradlew addExtension --extensions='oidc'
./gradlew addExtension --extensions='oidc'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これにより、ビルドファイルに次の内容が追加されます。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用:
implementation("io.quarkus:quarkus-oidc")implementation("io.quarkus:quarkus-oidc")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.5. アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
まず、/{tenant} エンドポイントを実装します。以下のソースコードからわかるように、これは単なる通常の Jakarta REST リソースです。
受信リクエストからテナントを解決し、application.properties 内の特定の quarkus-oidc テナント設定にマップするには、テナント設定を動的に解決できる io.quarkus.oidc.TenantConfigResolver インターフェイスの実装を作成します。
前述の実装では、テナントはリクエストパスから解決されます。テナントを推測できない場合は、デフォルトのテナント設定を使用する必要があることを示す null が返されます。
tenant-a アプリケーションタイプは hybrid です。提供されている場合、HTTP ベアラートークンを受け入れることができます。それ以外の場合は、認証が必要なときに認可コードフローを開始します。
5.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
最初の設定は、リクエストからテナントを推測できない場合に使用する必要があるデフォルトのテナント設定です。Dev Services for Keycloak を使用したマルチテナントアプリケーションのテストをサポートするために、quarkus.oidc.auth-server-url で %prod プロファイル接頭辞が使用されることに注意してください。この設定では、Keycloak インスタンスを使用してユーザーを認証します。
TenantConfigResolver によって提供される 2 番目の設定は、受信リクエストが tenant-a テナントにマップされるときに使用されます。
両方の設定は、異なる realms を使用しながら、同じ Keycloak サーバーインスタンスにマップされます。
あるいは、application.properties でテナント tenant-a を直接設定することもできます。
その場合は、カスタム TenantConfigResolver を使用して解決します。
設定ファイルで複数のテナントを定義できます。TenantResolver 実装からテナントを解決するときに正しくマップするには、それぞれに一意のエイリアスがあることを確認します。
ただし、application.properties でテナントを設定し、TenantResolver を使用して解決する静的テナント解決を使用すると、リクエストが個々のテナントにどのようにマッピングされるかがわからず、テナント固有の quarkus.oidc.<tenant-id>.auth-server-url 値を動的に提供できないため、Dev Services for Keycloak を使用したエンドポイントのテストには機能しません。したがって、application.properties 内のテナント固有の URL で %prod 接頭辞を使用することは、テストモードと開発モードの両方で機能しません。
現在のテナントが OIDC web-app アプリケーションを表す際、テナント固有の状態またはセッション Cookie がすでに存在する場合に、コード認証フローを完了するすべての要求とすでに認証された要求に対してカスタムテナントリゾルバーが呼び出されるまでに、現在の io.vertx.ext.web.RoutingContext には、tenant-id 属性が含まれます。したがって、複数の OIDC プロバイダーを使用する際、RoutingContext に tenant-id 属性が設定されていない場合にのみ、テナント ID を解決するためにパス固有のチェックが必要になります。次に例を示します。
これは、カスタム TenantResolver が登録されていない場合に、Quarkus OIDC が静的カスタムテナントを解決する方法です。
同様の手法を TenantConfigResolver でも使用できます。コンテキストで提供される tenant-id は、以前のリクエストですでに準備されている OidcTenantConfig を返すことができます。
Hibernate ORM マルチテナント または MongoDB と Panache マルチテナント も使用していて、両方のテナント ID が同じで、Vert.x の RoutingContext から抽出する必要がある場合は、OIDC Tenant Resolver からのテナント ID を Hibernate ORM Tenant Resolver または MongoDB と Panache Mongo Database Resolver に RoutingContext 属性として渡すことができます。次に例を示します。
5.7. Keycloak サーバーの起動と設定 リンクのコピーリンクがクリップボードにコピーされました!
Keycloak サーバーを起動するには、Docker を使用して次のコマンドを実行します。
docker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
docker run --name keycloak -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -p 8180:8080 quay.io/keycloak/keycloak:{keycloak.version} start-dev
ここで、keycloak.version は 24.0.0 以降に設定されます。
localhost:8180 で Keycloak サーバーにアクセスします。
Keycloak 管理コンソールにアクセスするには、admin ユーザーとしてログインします。ユーザー名とパスワードは両方とも admin です。
次に、2 つのテナントのレルムをインポートします。
- デフォルトのレルムを作成するには、default-tenant-realm.json をインポートします。
-
テナント
tenant-aのレルムを作成するには、tenant-a-realm.json をインポートします。
新しいレルムを作成する 方法の詳細は、Keycloak のドキュメントを参照してください。
5.8. アプリケーションの実行と使用 リンクのコピーリンクがクリップボードにコピーされました!
5.8.1. 開発者モードで実行 リンクのコピーリンクがクリップボードにコピーされました!
マイクロサービスを開発モードで実行するには、以下を使用します。
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
5.8.2. 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
5.8.3. ネイティブモードでの実行 リンクのコピーリンクがクリップボードにコピーされました!
この同じデモはネイティブコードにコンパイルできます。変更は必要ありません。
これは、生成されたバイナリーにランタイムテクノロジーが含まれ、最小限のリソースで実行するように最適化されているため、実稼働環境に JVM をインストールする必要がなくなることを意味します。
コンパイルには少し時間がかかるため、この手順はデフォルトでオフになっています。ネイティブビルドを有効にして再度ビルドしてみましょう。
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.package.type=native
./gradlew build -Dquarkus.package.type=nativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
しばらくすると、このバイナリーを直接実行できるようになります。
./target/security-openid-connect-multi-tenancy-quickstart-runner
./target/security-openid-connect-multi-tenancy-quickstart-runner
5.9. アプリケーションをテストする リンクのコピーリンクがクリップボードにコピーされました!
5.9.1. ブラウザーの使用 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションをテストするには、ブラウザーを開いて次の URL にアクセスします。
すべてが想定どおりに動作する場合、認証のために Keycloak サーバーにリダイレクトされます。要求されたパスは、設定ファイルでマッピングされていない default テナントを定義することに注意してください。この場合、デフォルト設定が使用されます。
アプリケーションを認証するには、Keycloak ログインページで次の認証情報を入力します。
-
ユーザー名:
alice -
パスワード:
alice
Login ボタンをクリックすると、アプリケーションにリダイレクトされます。
今すぐ次の URL でアプリケーションにアクセスしてみてください。
Keycloak ログインページに再度リダイレクトされます。ただし、今回は別のレルムを使用して認証します。
どちらの場合も、ユーザーが正常に認証されると、ランディングページにユーザーの名前とメールアドレスが表示されます。alice は両方のテナントに存在しますが、アプリケーションはそれらを別々のレルム内の別個のユーザーとして扱います。
5.10. 静的テナント設定の解決 リンクのコピーリンクがクリップボードにコピーされました!
application.properties ファイルで複数のテナント設定を設定する場合は、テナント識別子の解決方法を指定するだけで済みます。テナント識別子の解決を設定するには、次のいずれかのオプションを使用します。
これらのテナント解決オプションは、テナント ID が解決されるまで、リストされている順序で試行されます。テナント ID が未解決のまま (null) の場合は、デフォルト (名前なし) のテナント設定が選択されます。
5.10.1. TenantResolver で解決する リンクのコピーリンクがクリップボードにコピーされました!
次の application.properties の例は、TenantResolver メソッドを使用して、a および b という名前の 2 つのテナントのテナント ID を解決する方法を示しています。
quarkus.oidc.TenantResolver から a または b のテナント ID を返すことができます。
この例では、最後のリクエストパスセグメントの値はテナント ID ですが、必要に応じて、より複雑なテナント ID 解決ロジックを実装できます。
5.10.2. デフォルトの解像度 リンクのコピーリンクがクリップボードにコピーされました!
テナント識別子のデフォルトの解決は規則に基づいており、認証要求には要求パスの最後のセグメントにテナント識別子が含まれている必要があります。
次の application.properties の例は、google と github という名前の 2 つのテナントを設定する方法を示しています。
上記の例では、両方のテナントが OIDC web-app アプリケーションを設定して、認可コードフローを使用してユーザーを認証し、認証後にセッション Cookie を生成することを要求します。Google または GitHub が現在のユーザーを認証すると、ユーザーは、JAX-RS エンドポイント上のセキュリティーで保護されたリソースパスなど、認証されたユーザーの /signed-in 領域に戻されます。
最後に、デフォルトのテナント解決を完了するには、次の設定プロパティーを設定します。
quarkus.http.auth.permission.login.paths=/google,/github quarkus.http.auth.permission.login.policy=authenticated
quarkus.http.auth.permission.login.paths=/google,/github
quarkus.http.auth.permission.login.policy=authenticated
エンドポイントが http://localhost:8080 で実行している場合は、特定の /google または /github JAX-RS リソースパスを追加せずに、ユーザーが http://localhost:8080/google または http://localhost:8080/github にログインするための UI オプションを提供することもできます。認証が完了すると、テナント識別子もセッション Cookie 名に記録されます。したがって、認証されたユーザーは、セキュリティー保護された URL に google または github のパス値を含める必要なく、セキュリティー保護されたアプリケーション領域にアクセスできます。
デフォルトの解決は、ベアラートークン認証でも機能します。ただし、テナント識別子は常に最後のパスセグメント値として設定する必要があるため、あまり実用的ではない可能性があります。
5.10.3. アノテーションで解決する リンクのコピーリンクがクリップボードにコピーされました!
io.quarkus.oidc.TenantResolver を使用する代わりに、io.quarkus.oidc.Tenant アノテーションを使用してテナント識別子を解決することができます。
これを機能させるには、プロアクティブ HTTP 認証を無効にする必要があります (quarkus.http.auth.proactive=false)。詳細は、プロアクティブ認証 ガイドを参照してください。
アプリケーションが hr テナントと default テナントの 2 つの OIDC テナントをサポートしていると仮定すると、@Tenant("hr") を持つすべてのリソースメソッドとクラスは、quarkus.oidc.hr.auth-server-url によって設定された OIDC プロバイダーを使用して認証されます。対照的に、他のすべてのクラスとメソッドは、引き続きデフォルトの OIDC プロバイダーを使用して認証されます。
- 1
io.quarkus.oidc.Tenantアノテーションは、リソースクラスまたはリソースメソッドのいずれかに配置する必要があります。
5.11. 動的なテナント設定の解決 リンクのコピーリンクがクリップボードにコピーされました!
サポートするさまざまなテナントに対してより動的な設定が必要であり、設定ファイルに複数のエントリーを含めたくない場合は、io.quarkus.oidc.TenantConfigResolver を使用できます。
このインターフェイスを使用すると、実行時にテナント設定を動的に作成できます。
このメソッドによって返される OidcTenantConfig は、application.properties. から oidc namespace 設定を解析するために使用されるものと同じです。quarkus-oidc エクステンションでサポートされている任意の設定を使用して、これを入力できます。
動的テナントリゾルバーが null を返す場合は、次に 静的テナント設定の解決 が試行されます。
5.11.1. OIDC web-app アプリケーションのテナント解決 リンクのコピーリンクがクリップボードにコピーされました!
OIDC web-app アプリケーション設定を解決する最も簡単なオプションは、デフォルトの解決 セクションで説明されている手順に従うことです。
デフォルトの解像度ストラテジーがアプリケーション設定で機能しない場合は、以下のいずれかのオプションを試してください。
service および web-app の両方の OIDC アプリケーションに対する現在の HTTP 要求を保護するために使用するテナント設定を選択するには、次のようないくつかのオプションがあります。
-
URL パスを確認してください。たとえば、
/serviceパスにはtenant-service設定を使用し、/managementパスにはtenant-manage設定を使用する必要があります。 -
HTTP ヘッダーを確認してください。たとえば、URL パスが常に
/serviceである場合、Realm: service、Realm: managementなどのヘッダーを使用すると、tenant-service設定とtenant-manage設定を選択できます。 - URL クエリーパラメーターを確認してください。これは、ヘッダーを使用してテナント設定を選択する方法と同様に機能します。
これらのオプションはすべて、OIDC service アプリケーションのカスタム TenantResolver および TenantConfigResolver 実装を使用して簡単に実装できます。
ただし、OIDC web-app アプリケーションのコード認証フローを完了するには HTTP リダイレクトが必要なため、このリダイレクト要求の前後で同じテナント設定を選択するには、カスタム HTTP Cookie が必要になる場合があります。その理由は次のとおりです。
- OIDC プロバイダーに単一のリダイレクト URL が登録されている場合は、リダイレクト要求後の URL パスが同じではない可能性があります。テナント設定が解決された後、元のリクエストパスを復元できます。
- 元のリクエスト中に使用された HTTP ヘッダーは、リダイレクト後に使用できなくなります。
- カスタム URL クエリーパラメーターはリダイレクト後に復元されますが、テナント設定が解決された後にのみ復元されます。
リダイレクトの前後で web-app アプリケーションのテナント設定を解決するための情報が利用できるようにする 1 つのオプションは、Cookie を使用することです。次に例を示します。
5.12. テナント設定を無効にする リンクのコピーリンクがクリップボードにコピーされました!
現在のリクエストからテナントを推測できず、デフォルトのテナント設定へのフォールバックが必要な場合、カスタム TenantResolver および TenantConfigResolver 実装は null を返すことがあります。
カスタムリゾルバーが常にテナントを解決することを期待する場合は、デフォルトのテナント解決を設定する必要はありません。
-
デフォルトのテナント設定をオフにするには、
quarkus.oidc.tenant-enabled=falseを設定します。
quarkus.oidc.auth-server-url が設定されていない場合、デフォルトのテナント設定は自動的に無効になりますが、カスタムテナント設定が使用可能であるか、TenantConfigResolver が登録されています。
テナント固有の設定も無効にできることに注意してください (例: quarkus.oidc.tenant-a.tenant-enabled=false)。
5.13. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第6章 OpenID Connect (OIDC) 設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
Quarkus 開発者は、src/main/resources/application.properties ファイルで次のプロパティーを設定して、Quarkus OpenID Connect (OIDC) エクステンションを設定します。
ビルド時に固定された設定プロパティー: その他の設定プロパティーはすべて実行時にオーバーライド可能
| 型 | デフォルト | |
|
Dev Services を有効 (デフォルト) または無効にするフラグ。有効にすると、Dev Services for Keycloak は、Docker の実行時に、Keycloak を開発モードまたはテストモードで自動的に設定して起動します。
環境変数: | boolean |
|
|
Dev Services プロバイダーのコンテナーイメージ名。デフォルトでは、Quarkus ベースの Keycloak イメージになります。WildFly ベースのディストリビューションの場合は、
環境変数: | string |
|
|
Keycloak-X イメージが使用されているかどうかを示します。デフォルトでは、イメージはイメージ名の
環境変数: | boolean | |
|
Keycloak コンテナーが共有されているかどうかを決定します。共有されると、Quarkus はラベルベースのサービス検出を使用して実行中の Keycloak コンテナーを見つけて再利用するため、2 番目のコンテナーは起動しません。一致するコンテナーが見つからない場合は、新しいコンテナーが起動します。サービス検出では、
環境変数: | boolean |
|
|
Keycloak コンテナーを識別するための
環境変数: | string |
|
|
Keycloak レルムファイルへのクラスまたはファイルシステムパスのコンマ区切りリスト。このリストは Keycloak を初期化するために使用されます。このリストの最初の値は、デフォルトのテナント接続プロパティーを初期化するために使用されます。
環境変数: | 文字列のリスト | |
|
keycloak JVM に渡される
環境変数: | string | |
|
"Keycloak:" という接頭辞が付いた Keycloak ログメッセージを表示します。
環境変数: | boolean |
|
|
Keycloak 開始コマンド。このプロパティーを使用して、Keycloak の起動オプションを試してください。
環境変数: | string | |
|
Keycloak レルムの名前。このプロパティーは、
環境変数: | string | |
|
環境変数: | boolean |
|
|
開発サービスがリッスンする特定のポート。 指定しない場合はランダムなポートが選択されます。
環境変数: | int | |
|
Keycloak を初期化するために使用される追加のクラスまたはファイルシステムリソースへのエイリアス。各マップエントリーは、エイリアスとクラスまたはファイルシステムリソースパス間のマッピングを表します。
環境変数: |
| |
|
Keycloak を初期化するために使用される追加のクラスまたはファイルシステムリソース。各マップエントリーは、クラスまたはファイルシステムリソースパスエイリアスと Keycloak コンテナーの場所間のマッピングを表します。
環境変数: |
| |
|
Keycloak ユーザー名とパスワードのマップ。空の場合、デフォルトのユーザー
環境変数: |
| |
|
Keycloak ユーザーのロールのマップ。空の場合、デフォルトのロールが割り当てられます。
環境変数: |
| |
|
コンテナーに渡される環境変数。
環境変数: |
| |
|
OIDC エクステンションが有効になっている場合。
環境変数: | boolean |
|
|
OIDC 'service' アプリケーションをテストするためのトークンを取得するために使用されるグラントタイプ
環境変数: | tooltip:client['client_credentials' グラント]、tooltip:password['password' グラント]、tooltip:code['authorization_code' グラント]、tooltip:implicit['implicit' グラント] | |
|
WebClient のタイムアウト。このプロパティーを使用して、OpenId Connect Provider からトークンを要求し、それをサービスエンドポイントに送信するときに、Dev UI ハンドラーによって使用される HTTP クライアントが応答を待機する時間を設定します。このタイムアウトは、OIDC 開発サービス管理クライアントでも使用されます。
環境変数: |
| |
|
デフォルトの TokenIntrospection および UserInfo Cache 実装 Bean の登録を有効にします。注記: これにより、デフォルトの実装のみが有効になります。有効にするには設定が必要です。
環境変数: | boolean |
|
|
OpenID Connect (OIDC) サーバーのベース URL (例:
環境変数: | string | |
|
OIDC エンドポイントの検出。有効になっていない場合は、OIDC エンドポイント URL を個別に設定する必要があります。
環境変数: | boolean |
|
|
アクセストークンと更新トークンを発行する OIDC トークンエンドポイント。相対パスまたは絶対 URL として指定されます。
環境変数: | string | |
|
OIDC トークン失効エンドポイントの相対パスまたは絶対 URL。
環境変数: | string | |
|
アプリケーションのクライアント ID各アプリケーションには、アプリケーションを識別するために使用されるクライアント ID があります。
環境変数: | string | |
|
OIDC サーバーへの初期接続を試行する期間。たとえば、期間を
環境変数: | ||
|
既存の OIDC 接続が一時的に失われた場合に、再確立を再試行する回数。最初の接続試行にのみ適用される
環境変数: | int |
|
|
現在の OIDC 接続リクエストがタイムアウトするまでの秒数。
環境変数: |
| |
|
DNS ルックアップをワーカースレッドで実行するかどうか。このオプションは、OIDC サーバーへの HTTP リクエストによってブロックされた Vert.x イベントループに関するログに記録された警告を確認できる場合に使用してください。
環境変数: | boolean |
|
|
WebClient が使用する接続プールの最大サイズ。
環境変数: | int | |
|
環境変数: | string | |
|
クライアントシークレットの値。
環境変数: | string | |
|
CredentialsProvider 名 (複数の CredentialsProvider が登録されている場合にのみ設定する必要あり)
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
認証方法。
環境変数: |
tooltip:basic[ | |
|
指定されている場合、JWT がシークレットキーを使用して署名されていることを示します。
環境変数: | string | |
|
CredentialsProvider 名 (複数の CredentialsProvider が登録されている場合にのみ設定する必要あり)
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。
環境変数: | string | |
|
指定されている場合、JWT はキーストアの秘密鍵を使用して署名されていることを示します。
環境変数: | string | |
|
キーストアファイルのパスワードを指定するためのパラメーター。
環境変数: | string | |
|
秘密鍵の ID またはエイリアス。
環境変数: | string | |
|
秘密鍵のパスワード。
環境変数: | string | |
|
JWT オーディエンス (
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
環境変数: | string | |
|
JWT の有効期間 (秒単位)。この値は、JWT が発行された時刻に追加され、有効期限を計算します。
環境変数: | int |
|
|
プロキシーのホスト名または IP アドレス。
環境変数: | string | |
|
プロキシーのポート番号。デフォルト値は
環境変数: | int |
|
|
プロキシーに認証が必要な場合のユーザー名。
環境変数: | string | |
|
プロキシーに認証が必要な場合のパスワード。
環境変数: | string | |
|
証明書の検証とホスト名の検証。次のいずれかの
環境変数: | tooltip:required[[証明書が検証され、ホスト名の検証が有効になっています。これはデフォルト値です。]、tooltip:certificate-validation[証明書は検証されますが、ホスト名の検証は無効になっています。]、tooltip:none[すべての証明書が信頼されており、ホスト名の検証は無効になっています。] | |
|
個別のファイルを指定する代わりに証明書情報を保持するオプションのキーストア。
環境変数: | path | |
|
キーストアファイルのタイプ。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
キーストアファイルのプロバイダー。指定しない場合は、キーストアのファイルタイプに基づいてプロバイダーが自動的に検出されます。
環境変数: | string | |
|
キーストアファイルのパスワード。指定しない場合は、デフォルト値の
環境変数: | string | |
|
キーストア内の特定のキーのエイリアス。SNI が無効になっていて、キーストアに複数のキーが含まれており、エイリアスが指定されていない場合、動作は未定義になります。
環境変数: | string | |
|
キーのパスワード (
環境変数: | string | |
|
信頼する証明書の証明書情報を保持するトラストストア。
環境変数: | path | |
|
トラストストアファイルのパスワード。
環境変数: | string | |
|
トラストストア証明書のエイリアス。
環境変数: | string | |
|
トラストストアファイルのタイプ。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
トラストストアファイルのプロバイダー。指定しない場合は、トラストストアのファイルタイプに基づいてプロバイダーが自動的に検出されます。
環境変数: | string | |
|
一意のテナント識別子。これは、テナント設定を動的に解決する
環境変数: | string | |
|
このテナント設定が有効になっている場合。デフォルトのテナントは、設定されていないが、テナント設定を解決する
環境変数: | boolean |
|
|
アプリケーションの種類。次の
環境変数: |
tooltip:web-app[ |
|
|
ユーザーを認証する OpenID Connect (OIDC) 認可エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効な場合は、
環境変数: | string | |
|
OIDC UserInfo エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効で、
環境変数: | string | |
|
不透明トークンと JSON Web Token (JWT) トークンの両方をイントロスペクトできる OIDC RFC7662 イントロスペクションエンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効になっていて、1) 不透明なベアラーアクセストークンを検証する必要がある場合、または 2) 一致する JWK のないキャッシュされた JWK 検証セットが更新されている間に JWT トークンを検証する必要がある場合は、このプロパティーを設定する必要があります。検出が有効になっている場合は、このプロパティーが無視されます。
環境変数: | string | |
|
JSON Web キー検証セットを返す OIDC JSON Web キーセット (JWKS) エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効になっていて、ローカル JWT 検証が必要な場合は、このプロパティーを設定する必要があります。検出が有効になっている場合は、このプロパティーが無視されます。
環境変数: | string | |
|
OIDC end_session_endpoint の相対パスまたは絶対 URL。OIDC 検出が無効で、
環境変数: | string | |
|
ローカル JWT トークン検証用の公開鍵。このプロパティーが設定されている場合、OIDC サーバー接続は作成されません。
環境変数: | string | |
|
名前
環境変数: | string | |
|
Secret
環境変数: | string | |
|
環境変数: | boolean |
|
|
グループの配列を含むクレームへのパスのリスト。各パスは最上位の JWT JSON オブジェクトから始まり、複数のセグメントを含めることができます。各セグメントは JSON オブジェクト名のみを表します (例: "realm/groups")。namespace 修飾クレーム名には二重引用符を使用します。このプロパティーは、トークンに
環境変数: | 文字列のリスト | |
|
複数のグループ値を含む文字列を分割するための区切り文字。これは、"role-claim-path" プロパティーが、値が文字列である 1 つ以上のカスタムクレームを指している場合にのみ使用されます。標準
環境変数: | string | |
|
主なロールのソース。
環境変数: |
ツールチップ:idtoken[ID トークン - | |
|
予想される発行者
環境変数: | string | |
|
予想される audience
環境変数: | 文字列のリスト | |
|
トークンに、現在のユーザーに対して一意で再割り当てされない識別子である
環境変数: | boolean |
|
|
予想されるトークンの種類
環境変数: | string | |
|
期限の猶予期間 (秒単位)。トークンの有効期限をチェックする場合、現在の時刻はトークンの有効期限より最大で設定された秒数だけ遅くなることが許可されます。トークンの発行をチェックする場合、現在の時刻はトークンの発行時刻より最大で設定された秒数だけ早くなることが許可されます。
環境変数: | int | |
|
トークンの経過時間。
環境変数: | ||
|
プリンシパル名を含むクレームの名前。デフォルトでは、
環境変数: | string | |
|
期限切れの認可コードフロー ID またはアクセストークンを更新します。このプロパティーを有効にすると、認可コード ID またはアクセストークンの有効期限が切れている場合に更新トークンリクエストが実行され、成功した場合は、ローカルセッションが新しいトークンセットで更新されます。そうでない場合、ローカルセッションは無効になり、ユーザーは再認証のために OpenID Provider にリダイレクトされます。この場合、OIDC プロバイダーセッションがまだアクティブな場合は、ユーザーは再度チャレンジされない可能性があります。このオプションを有効にするには、更新トークンが現在ユーザーセッション内に保持されているため、
環境変数: | boolean |
|
|
更新トークンの時間のずれ (秒単位)。このプロパティーを有効にすると、認可コード ID またはアクセストークンを更新する必要があるかどうかを確認するときに、設定された秒数が現在の時刻に追加されます。合計が認可コード ID またはアクセストークンの有効期限より大きい場合は、更新が行われます。
環境変数: | ||
|
強制的な JWK セットの更新間隔 (分単位)。
環境変数: |
| |
|
ベアラートークンを含むカスタム HTTP ヘッダー。このオプションは、アプリケーションのタイプが
環境変数: | string | |
|
HTTP 認可ヘッダースキーム。
環境変数: | string |
|
|
必要な署名アルゴリズム。OIDC プロバイダーは多くの署名アルゴリズムをサポートしていますが、必要に応じて、このプロパティーで設定されたアルゴリズムを使用して署名されたトークンのみを受け入れるように Quarkus アプリケーションを制限できます。
環境変数: |
| |
|
復号化キーの場所。JWT トークンは、OpenId Connect プロバイダーによって内部署名および暗号化できます。ただし、プロバイダーが秘密の復号化キーを制御していない場合があるため、このようなトークンをリモートでイントロスペクトすることが常に可能であるとは限りません。このような場合は、このプロパティーを、PEM または JSON Web Key (JWK) 形式の復号化秘密鍵を含むファイルを指すように設定します。このプロパティーが設定されておらず、
環境変数: | string | |
|
一致する JWK キーが利用できない場合に、JWT トークンのリモートイントロスペクションを許可します。下位互換性のため、このプロパティーはデフォルトで
環境変数: | boolean |
|
|
JWT トークンはリモートでのみイントロスペクトされるように要求します。
環境変数: | boolean |
|
|
不透明トークンのリモートイントロスペクションを許可します。JWT トークンのみが予想される場合は、このプロパティーを
環境変数: | boolean |
|
|
トークンカスタマイザー名。テナント固有のトークンカスタマイザーを名前付き Bean として選択できるようにします。カスタム
環境変数: | string | |
|
不透明 (バイナリー) アクセストークンを使用して UserInfo をリクエストし、そのアクセストークンが有効であることを間接的に確認します。プロバイダーがこのトークンを受け入れ、有効な UserInfo を返した場合、不透明アクセストークンは有効であると見なされます。このオプションは、不透明アクセストークンを受け入れる必要があるが、OpenId Connect プロバイダーにトークンイントロスペクションエンドポイントがない場合にのみ有効にする必要があります。JWT トークンを検証する必要がある場合、このプロパティーは効果がありません。
環境変数: | boolean |
|
|
アプリケーションのログアウトエンドポイントの相対パス。指定されている場合、アプリケーションは OpenID Connect RP 開始ログアウト仕様に準拠して、このエンドポイントを介してログアウトを開始できます。
環境変数: | string | |
|
OpenID Connect Provider からログアウトした後にユーザーがリダイレクトされるアプリケーションエンドポイントの相対パス。このエンドポイント URI は、有効なリダイレクト URI として OpenID Connect Provider に適切に登録されている必要があります。
環境変数: | string | |
|
ログアウトリダイレクト URI にクエリーパラメーターとして追加される、ログアウト後の URI パラメーターの名前。
環境変数: | string |
|
|
アプリケーションにおける Back-Channel Logout エンドポイントの相対パス。
環境変数: | string | |
|
セッション Cookie に保存されている ID トークンと照合される前にキャッシュできるログアウトトークンの最大数。
環境変数: | int |
|
|
ログアウトトークンをキャッシュできる時間 (分)。
環境変数: |
| |
|
トークンキャッシュタイマー間隔。このプロパティーが設定されている場合は、タイマーが定期的に古いエントリーをチェックして削除します。
環境変数: | ||
|
トークンをキャッシュするためのキーとして値が使用されるログアウトトークン要求。キーとして使用できるのは、
環境変数: | string |
|
|
アプリケーションにおける Front-Channel Logout エンドポイントの相対パス。
環境変数: | string | |
|
リーフ証明書のコモンネーム。この証明書が
環境変数: | string | |
|
信頼された証明書のサムプリントを保存する Truststore ファイル。
環境変数: | path | |
|
環境変数: | string | |
|
トラストストア証明書のエイリアスを指定するためのパラメーター。
環境変数: | string | |
|
トラストストアファイルのタイプを指定するためのオプションパラメーター。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
認可コードフローレスポンスモード。
環境変数: |
tooltip:query[認可レスポンスパラメーターは、 |
|
|
環境変数: | string | |
|
このプロパティーを
環境変数: | boolean |
|
|
ユーザーが認証された後、クエリーパラメーターなしでユーザーを同じ URI にリダイレクトして、リダイレクト URI 上の OIDC サーバーによって設定された
環境変数: | boolean |
|
|
OIDC 認可エンドポイントからのエラーレスポンスを処理するパブリックエンドポイントへの相対パス。ユーザー認証が失敗した場合、OIDC プロバイダーは、期待される認可
環境変数: | string | |
|
ID トークンとアクセストークンの両方が、認可コードフローの一部として OIDC プロバイダーから取得されます。ID トークンは、プリンシパルを表し、ロールを抽出するために使用されるプライマリートークンとして、すべてのユーザーリクエストで常に検証されます。アクセストークンは、ダウンストリームサービスに伝播されることを意図しているため、デフォルトでは検証されません。アクセストークンが JWT トークンとして注入される場合は、アクセストークンの検証を有効にする必要があります。コードフローの一部として取得されたアクセストークンは、
環境変数: | boolean |
|
|
SSL/TLS 終了リバースプロキシーの背後で実行する場合は、
環境変数: | boolean |
|
|
スコープのリスト
環境変数: | 文字列のリスト | |
|
ID トークンに
環境変数: | boolean |
|
|
環境変数: | boolean |
|
|
存在する場合は認証リダイレクト URI に追加される URL クエリーパラメーターを要求します。
環境変数: | 文字列のリスト | |
|
有効にすると、HTTP の使用時に、状態、セッション、およびログアウト後の Cookie の
環境変数: | boolean |
|
|
Cookie 名の接尾辞。たとえば、デフォルトの OIDC テナントのセッション Cookie 名は
環境変数: | string | |
|
Cookie パスパラメーター値。設定されている場合、セッション、状態、およびログアウト後の Cookie のパスパラメーターを設定するのに使用されます。
環境変数: | string |
|
|
Cookie パスヘッダーパラメーター値。設定されている場合、セッション、状態、およびログアウト後の Cookie のパスパラメーターを設定するのに使用される値の受信 HTTP ヘッダーを識別します。ヘッダーが欠落している場合は、
環境変数: | string | |
|
設定されている場合、セッション、状態、およびログアウト後の Cookie に使用される Cookie ドメインパラメーター値。
環境変数: | string | |
|
セッション Cookie の SameSite 属性。
環境変数: |
|
|
|
状態 Cookie が存在する場合は、
環境変数: | boolean |
|
|
状態 Cookie は存在するが状態クエリーパラメーターが存在しない場合は、HTTP 401 エラーで失敗します。 複数の認証が無効になっているか、リダイレクト URL が元の要求 URL と一致する場合、OpenId Connect プロバイダーへの以前の失敗したリダイレクトからの古い状態 Cookie がブラウザーキャッシュに残り、現在の要求中に表示される可能性があります。たとえば、シングルページアプリケーション (SPA) が XHR を使用して、認可エンドポイントで CORS をサポートしていないプロバイダーへのリダイレクトを処理する場合、ブラウザーはそれをブロックし、Quarkus によって作成された状態 Cookie はブラウザーキャッシュに残ります。Quarkus は、このような古い状態 Cookie を検出したが、一致する状態クエリーパラメーターが見つからない場合に、認証失敗を報告します。
このような場合には、通常、HTTP 401 エラーを報告するのが適切です。これにより、ブラウザーのリダイレクトループのリスクが最小限に抑えられるだけでなく、SPA または Quarkus アプリケーションがリダイレクトを管理する方法の問題を特定することもできます。たとえば、このようなエラーを回避するには、
ただし、上記のオプションが適切でない場合は、このプロパティーを
環境変数: | boolean |
|
|
このプロパティーが
環境変数: | boolean |
|
|
セッションの有効期間を分単位で延長します。ユーザーセッションの有効期間プロパティーは、デフォルトで ID トークンの有効期間の値に設定され、セッションの有効期限が切れると、ユーザーは OIDC プロバイダーにリダイレクトされて再認証されます。このプロパティーがゼロ以外の値に設定されている場合は、セッションの有効期限が切れる前に期限切れの ID トークンを更新できます。
環境変数: |
| |
|
このプロパティーが
このプロパティーが
環境変数: | boolean |
|
|
認可コードフローが完了したときに ID トークンが使用可能であることを必須にします。ID トークンを返さない OAuth2 プロバイダーで認可コードフローを使用する必要がある場合にのみ、このプロパティーを無効にします。そのような場合には、内部 IdToken が生成されます。
環境変数: | boolean |
|
|
内部 ID トークンの有効期間。このプロパティーは、Oauth2 プロバイダーが IdToken を返さない場合に内部 IdToken が生成される場合にのみチェックされます。
環境変数: |
| |
|
Proof Key for Code Exchange (PKCE) の使用を必須にします。
環境変数: | boolean |
|
|
コードフロー状態で Proof Key for Code Exchange (PKCE) コードベリファイアまたは nonce、もしくはその両方を暗号化するために使用されるシークレット。このシークレットは少なくとも 32 文字の長さである必要があります。
このシークレットが設定されていない場合は、 これらすべてのプロパティーをチェックした後もシークレットが初期化されていない場合は、シークレットが自動生成されます。 シークレットの長さが 16 文字未満の場合、エラーが報告されます。
環境変数: | string | |
|
デフォルトの TokenStateManager ストラテジー。
環境変数: | tooltip:keep-all-tokens[ID、アクセストークン、更新トークンを保持します。], tooltip:id-token[ID トークンのみを保持します], tooltip:id-refresh-tokens[ID トークンと更新トークンのみを保持します] |
|
|
デフォルトの TokenStateManager は、デフォルトで、認可コードグラントのレスポンスで返されたすべてのトークン (ID、アクセス、更新) を単一のセッション Cookie に保持します。このプロパティーを有効にすると、セッション Cookie のサイズが最小化されます
環境変数: | boolean |
|
|
デフォルトの TokenStateManager がトークンを保存するセッション Cookie を暗号化することを必須にします。
環境変数: | boolean |
|
|
このシークレットが設定されていない場合は、 トークンの暗号化に使用されるシークレットの長さは、少なくとも 32 文字である必要があります。シークレットの長さが 16 文字未満の場合、警告が記録されます。
環境変数: | string | |
|
トークンイントロスペクションデータのキャッシュを許可します。このプロパティーを有効にしても、キャッシュ自体は有効にならず、特定のテナントのトークンイントロスペクションのキャッシュのみが許可されることに注意してください。デフォルトのトークンキャッシュを使用できる場合は、
環境変数: | boolean |
|
|
ユーザー情報データのキャッシュを許可します。このプロパティーを有効にしても、キャッシュ自体は有効にならず、特定のテナントのユーザー情報データのキャッシュのみが許可されることに注意してください。デフォルトのトークンキャッシュを使用できる場合は、
環境変数: | boolean |
|
|
UserInfo をトークンキャッシュにキャッシュするのではなく、IdToken にインライン化できるようにします。このプロパティーは、Oauth2 プロバイダーが IdToken を返さない場合に内部 IdToken が生成される場合にのみチェックされます。生成された IdToken に UserInfo をインライン化すると、それをセッション Cookie に保存でき、キャッシュされた状態が導入されるのを回避できます。
環境変数: | boolean |
|
|
OIDC プロバイダーへの接続が初期化される瞬間に JWK 検証キーを取得する必要がある場合。 このプロパティーを無効にすると、現在のトークンを検証する必要がある瞬間までキーの取得が遅延となります。通常、これは、トークンまたはその他の関連付けられたリクエストプロパティーが、キーを正しく解決するために必要な追加のコンテキストを提供する場合にのみ必要になります。
環境変数: | boolean |
|
|
キャッシュできる JWK キーの最大数。
環境変数: | int |
|
|
JWK キーをキャッシュできる時間 (分)。
環境変数: |
| |
|
キャッシュタイマー間隔。このプロパティーが設定されている場合は、タイマーが定期的に古いエントリーをチェックして削除します。
環境変数: | ||
|
周知の OpenId Connect プロバイダー識別子
環境変数: |
| |
|
キャッシュエントリーの最大数。キャッシュを有効にする必要がある場合は、正の値に設定します。
環境変数: | int |
|
|
特定のキャッシュエントリーが有効な最大時間。
環境変数: |
| |
|
タイマー間隔をクリーンアップします。このプロパティーが設定されている場合は、タイマーが定期的に古いエントリーをチェックして削除します。
環境変数: | ||
|
グラントオプション
環境変数: |
| |
|
追加のクレーム。
環境変数: |
| |
|
必要なクレームとその期待値のマップ。たとえば
環境変数: |
| |
|
ログアウトリダイレクト URI にクエリーパラメーターとして追加される追加プロパティー。
環境変数: |
| |
|
認証リダイレクト URI にクエリーパラメーターとして追加された追加のプロパティー。
環境変数: |
| |
|
必須の
環境変数: |
| |
|
認可コードグラントリクエストを完了するために送信する必要があるカスタム HTTP ヘッダー。
環境変数: |
| |
| 型 | デフォルト | |
|
OpenID Connect (OIDC) サーバーのベース URL (例:
環境変数: | string | |
|
OIDC エンドポイントの検出。有効になっていない場合は、OIDC エンドポイント URL を個別に設定する必要があります。
環境変数: | boolean |
|
|
アクセストークンと更新トークンを発行する OIDC トークンエンドポイント。相対パスまたは絶対 URL として指定されます。
環境変数: | string | |
|
OIDC トークン失効エンドポイントの相対パスまたは絶対 URL。
環境変数: | string | |
|
アプリケーションのクライアント ID各アプリケーションには、アプリケーションを識別するために使用されるクライアント ID があります。
環境変数: | string | |
|
OIDC サーバーへの初期接続を試行する期間。たとえば、期間を
環境変数: | ||
|
既存の OIDC 接続が一時的に失われた場合に、再確立を再試行する回数。最初の接続試行にのみ適用される
環境変数: | int |
|
|
現在の OIDC 接続リクエストがタイムアウトするまでの秒数。
環境変数: |
| |
|
DNS ルックアップをワーカースレッドで実行するかどうか。このオプションは、OIDC サーバーへの HTTP リクエストによってブロックされた Vert.x イベントループに関するログに記録された警告を確認できる場合に使用してください。
環境変数: | boolean |
|
|
WebClient が使用する接続プールの最大サイズ。
環境変数: | int | |
|
環境変数: | string | |
|
クライアントシークレットの値。
環境変数: | string | |
|
CredentialsProvider 名 (複数の CredentialsProvider が登録されている場合にのみ設定する必要あり)
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
認証方法。
環境変数: |
tooltip:basic[ | |
|
指定されている場合、JWT がシークレットキーを使用して署名されていることを示します。
環境変数: | string | |
|
CredentialsProvider 名 (複数の CredentialsProvider が登録されている場合にのみ設定する必要あり)
環境変数: | string | |
|
CredentialsProvider クライアントのシークレットキー
環境変数: | string | |
|
指定されている場合、PEM または JWK 形式の秘密鍵を使用して JWT が署名されていることを示します。
環境変数: | string | |
|
指定されている場合、JWT はキーストアの秘密鍵を使用して署名されていることを示します。
環境変数: | string | |
|
キーストアファイルのパスワードを指定するためのパラメーター。
環境変数: | string | |
|
秘密鍵の ID またはエイリアス。
環境変数: | string | |
|
秘密鍵のパスワード。
環境変数: | string | |
|
JWT オーディエンス (
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
JWT
環境変数: | string | |
|
追加のクレーム。
環境変数: |
| |
|
環境変数: | string | |
|
JWT の有効期間 (秒単位)。この値は、JWT が発行された時刻に追加され、有効期限を計算します。
環境変数: | int |
|
|
プロキシーのホスト名または IP アドレス。
環境変数: | string | |
|
プロキシーのポート番号。デフォルト値は
環境変数: | int |
|
|
プロキシーに認証が必要な場合のユーザー名。
環境変数: | string | |
|
プロキシーに認証が必要な場合のパスワード。
環境変数: | string | |
|
証明書の検証とホスト名の検証。次のいずれかの
環境変数: | tooltip:required[[証明書が検証され、ホスト名の検証が有効になっています。これはデフォルト値です。]、tooltip:certificate-validation[証明書は検証されますが、ホスト名の検証は無効になっています。]、tooltip:none[すべての証明書が信頼されており、ホスト名の検証は無効になっています。] | |
|
個別のファイルを指定する代わりに証明書情報を保持するオプションのキーストア。
環境変数: | path | |
|
キーストアファイルのタイプ。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
キーストアファイルのプロバイダー。指定しない場合は、キーストアのファイルタイプに基づいてプロバイダーが自動的に検出されます。
環境変数: | string | |
|
キーストアファイルのパスワード。指定しない場合は、デフォルト値の
環境変数: | string | |
|
キーストア内の特定のキーのエイリアス。SNI が無効になっていて、キーストアに複数のキーが含まれており、エイリアスが指定されていない場合、動作は未定義になります。
環境変数: | string | |
|
キーのパスワード (
環境変数: | string | |
|
信頼する証明書の証明書情報を保持するトラストストア。
環境変数: | path | |
|
トラストストアファイルのパスワード。
環境変数: | string | |
|
トラストストア証明書のエイリアス。
環境変数: | string | |
|
トラストストアファイルのタイプ。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
トラストストアファイルのプロバイダー。指定しない場合は、トラストストアのファイルタイプに基づいてプロバイダーが自動的に検出されます。
環境変数: | string | |
|
一意のテナント識別子。これは、テナント設定を動的に解決する
環境変数: | string | |
|
このテナント設定が有効になっている場合。デフォルトのテナントは、設定されていないが、テナント設定を解決する
環境変数: | boolean |
|
|
アプリケーションの種類。次の
環境変数: |
tooltip:web-app[ |
|
|
ユーザーを認証する OpenID Connect (OIDC) 認可エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効な場合は、
環境変数: | string | |
|
OIDC UserInfo エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効で、
環境変数: | string | |
|
不透明トークンと JSON Web Token (JWT) トークンの両方をイントロスペクトできる OIDC RFC7662 イントロスペクションエンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効になっていて、1) 不透明なベアラーアクセストークンを検証する必要がある場合、または 2) 一致する JWK のないキャッシュされた JWK 検証セットが更新されている間に JWT トークンを検証する必要がある場合は、このプロパティーを設定する必要があります。検出が有効になっている場合は、このプロパティーが無視されます。
環境変数: | string | |
|
JSON Web キー検証セットを返す OIDC JSON Web キーセット (JWKS) エンドポイントの相対パスまたは絶対 URL。OIDC 検出が無効になっていて、ローカル JWT 検証が必要な場合は、このプロパティーを設定する必要があります。検出が有効になっている場合は、このプロパティーが無視されます。
環境変数: | string | |
|
OIDC end_session_endpoint の相対パスまたは絶対 URL。OIDC 検出が無効で、
環境変数: | string | |
|
ローカル JWT トークン検証用の公開鍵。このプロパティーが設定されている場合、OIDC サーバー接続は作成されません。
環境変数: | string | |
|
名前
環境変数: | string | |
|
Secret
環境変数: | string | |
|
環境変数: | boolean |
|
|
グループの配列を含むクレームへのパスのリスト。各パスは最上位の JWT JSON オブジェクトから始まり、複数のセグメントを含めることができます。各セグメントは JSON オブジェクト名のみを表します (例: "realm/groups")。namespace 修飾クレーム名には二重引用符を使用します。このプロパティーは、トークンに
環境変数: | 文字列のリスト | |
|
複数のグループ値を含む文字列を分割するための区切り文字。これは、"role-claim-path" プロパティーが、値が文字列である 1 つ以上のカスタムクレームを指している場合にのみ使用されます。標準
環境変数: | string | |
|
主なロールのソース。
環境変数: |
ツールチップ:idtoken[ID トークン - | |
|
予想される発行者
環境変数: | string | |
|
予想される audience
環境変数: | 文字列のリスト | |
|
トークンに、現在のユーザーに対して一意で再割り当てされない識別子である
環境変数: | boolean |
|
|
必要なクレームとその期待値のマップ。たとえば
環境変数: |
| |
|
予想されるトークンの種類
環境変数: | string | |
|
期限の猶予期間 (秒単位)。トークンの有効期限をチェックする場合、現在の時刻はトークンの有効期限より最大で設定された秒数だけ遅くなることが許可されます。トークンの発行をチェックする場合、現在の時刻はトークンの発行時刻より最大で設定された秒数だけ早くなることが許可されます。
環境変数: | int | |
|
トークンの経過時間。
環境変数: | ||
|
プリンシパル名を含むクレームの名前。デフォルトでは、
環境変数: | string | |
|
期限切れの認可コードフロー ID またはアクセストークンを更新します。このプロパティーを有効にすると、認可コード ID またはアクセストークンの有効期限が切れている場合に更新トークンリクエストが実行され、成功した場合は、ローカルセッションが新しいトークンセットで更新されます。そうでない場合、ローカルセッションは無効になり、ユーザーは再認証のために OpenID Provider にリダイレクトされます。この場合、OIDC プロバイダーセッションがまだアクティブな場合は、ユーザーは再度チャレンジされない可能性があります。このオプションを有効にするには、更新トークンが現在ユーザーセッション内に保持されているため、
環境変数: | boolean |
|
|
更新トークンの時間のずれ (秒単位)。このプロパティーを有効にすると、認可コード ID またはアクセストークンを更新する必要があるかどうかを確認するときに、設定された秒数が現在の時刻に追加されます。合計が認可コード ID またはアクセストークンの有効期限より大きい場合は、更新が行われます。
環境変数: | ||
|
強制的な JWK セットの更新間隔 (分単位)。
環境変数: |
| |
|
ベアラートークンを含むカスタム HTTP ヘッダー。このオプションは、アプリケーションのタイプが
環境変数: | string | |
|
HTTP 認可ヘッダースキーム。
環境変数: | string |
|
|
必要な署名アルゴリズム。OIDC プロバイダーは多くの署名アルゴリズムをサポートしていますが、必要に応じて、このプロパティーで設定されたアルゴリズムを使用して署名されたトークンのみを受け入れるように Quarkus アプリケーションを制限できます。
環境変数: |
| |
|
復号化キーの場所。JWT トークンは、OpenId Connect プロバイダーによって内部署名および暗号化できます。ただし、プロバイダーが秘密の復号化キーを制御していない場合があるため、このようなトークンをリモートでイントロスペクトすることが常に可能であるとは限りません。このような場合は、このプロパティーを、PEM または JSON Web Key (JWK) 形式の復号化秘密鍵を含むファイルを指すように設定します。このプロパティーが設定されておらず、
環境変数: | string | |
|
一致する JWK キーが利用できない場合に、JWT トークンのリモートイントロスペクションを許可します。下位互換性のため、このプロパティーはデフォルトで
環境変数: | boolean |
|
|
JWT トークンはリモートでのみイントロスペクトされるように要求します。
環境変数: | boolean |
|
|
不透明トークンのリモートイントロスペクションを許可します。JWT トークンのみが予想される場合は、このプロパティーを
環境変数: | boolean |
|
|
トークンカスタマイザー名。テナント固有のトークンカスタマイザーを名前付き Bean として選択できるようにします。カスタム
環境変数: | string | |
|
不透明 (バイナリー) アクセストークンを使用して UserInfo をリクエストし、そのアクセストークンが有効であることを間接的に確認します。プロバイダーがこのトークンを受け入れ、有効な UserInfo を返した場合、不透明アクセストークンは有効であると見なされます。このオプションは、不透明アクセストークンを受け入れる必要があるが、OpenId Connect プロバイダーにトークンイントロスペクションエンドポイントがない場合にのみ有効にする必要があります。JWT トークンを検証する必要がある場合、このプロパティーは効果がありません。
環境変数: | boolean |
|
|
アプリケーションのログアウトエンドポイントの相対パス。指定されている場合、アプリケーションは OpenID Connect RP 開始ログアウト仕様に準拠して、このエンドポイントを介してログアウトを開始できます。
環境変数: | string | |
|
OpenID Connect Provider からログアウトした後にユーザーがリダイレクトされるアプリケーションエンドポイントの相対パス。このエンドポイント URI は、有効なリダイレクト URI として OpenID Connect Provider に適切に登録されている必要があります。
環境変数: | string | |
|
ログアウトリダイレクト URI にクエリーパラメーターとして追加される、ログアウト後の URI パラメーターの名前。
環境変数: | string |
|
|
ログアウトリダイレクト URI にクエリーパラメーターとして追加される追加プロパティー。
環境変数: |
| |
|
アプリケーションにおける Back-Channel Logout エンドポイントの相対パス。
環境変数: | string | |
|
セッション Cookie に保存されている ID トークンと照合される前にキャッシュできるログアウトトークンの最大数。
環境変数: | int |
|
|
ログアウトトークンをキャッシュできる時間 (分)。
環境変数: |
| |
|
トークンキャッシュタイマー間隔。このプロパティーが設定されている場合は、タイマーが定期的に古いエントリーをチェックして削除します。
環境変数: | ||
|
トークンをキャッシュするためのキーとして値が使用されるログアウトトークン要求。キーとして使用できるのは、
環境変数: | string |
|
|
アプリケーションにおける Front-Channel Logout エンドポイントの相対パス。
環境変数: | string | |
|
リーフ証明書のコモンネーム。この証明書が
環境変数: | string | |
|
信頼された証明書のサムプリントを保存する Truststore ファイル。
環境変数: | path | |
|
環境変数: | string | |
|
トラストストア証明書のエイリアスを指定するためのパラメーター。
環境変数: | string | |
|
トラストストアファイルのタイプを指定するためのオプションパラメーター。指定されていない場合、ファイル名に基き自動的に型が検出されます。
環境変数: | string | |
|
認可コードフローレスポンスモード。
環境変数: |
tooltip:query[認可レスポンスパラメーターは、 |
|
|
環境変数: | string | |
|
このプロパティーを
環境変数: | boolean |
|
|
ユーザーが認証された後、クエリーパラメーターなしでユーザーを同じ URI にリダイレクトして、リダイレクト URI 上の OIDC サーバーによって設定された
環境変数: | boolean |
|
|
OIDC 認可エンドポイントからのエラーレスポンスを処理するパブリックエンドポイントへの相対パス。ユーザー認証が失敗した場合、OIDC プロバイダーは、期待される認可
環境変数: | string | |
|
ID トークンとアクセストークンの両方が、認可コードフローの一部として OIDC プロバイダーから取得されます。ID トークンは、プリンシパルを表し、ロールを抽出するために使用されるプライマリートークンとして、すべてのユーザーリクエストで常に検証されます。アクセストークンは、ダウンストリームサービスに伝播されることを意図しているため、デフォルトでは検証されません。アクセストークンが JWT トークンとして注入される場合は、アクセストークンの検証を有効にする必要があります。コードフローの一部として取得されたアクセストークンは、
環境変数: | boolean |
|
|
SSL/TLS 終了リバースプロキシーの背後で実行する場合は、
環境変数: | boolean |
|
|
スコープのリスト
環境変数: | 文字列のリスト | |
|
ID トークンに
環境変数: | boolean |
|
|
環境変数: | boolean |
|
|
認証リダイレクト URI にクエリーパラメーターとして追加された追加のプロパティー。
環境変数: |
| |
|
存在する場合は認証リダイレクト URI に追加される URL クエリーパラメーターを要求します。
環境変数: | 文字列のリスト | |
|
有効にすると、HTTP の使用時に、状態、セッション、およびログアウト後の Cookie の
環境変数: | boolean |
|
|
Cookie 名の接尾辞。たとえば、デフォルトの OIDC テナントのセッション Cookie 名は
環境変数: | string | |
|
Cookie パスパラメーター値。設定されている場合、セッション、状態、およびログアウト後の Cookie のパスパラメーターを設定するのに使用されます。
環境変数: | string |
|
|
Cookie パスヘッダーパラメーター値。設定されている場合、セッション、状態、およびログアウト後の Cookie のパスパラメーターを設定するのに使用される値の受信 HTTP ヘッダーを識別します。ヘッダーが欠落している場合は、
環境変数: | string | |
|
設定されている場合、セッション、状態、およびログアウト後の Cookie に使用される Cookie ドメインパラメーター値。
環境変数: | string | |
|
セッション Cookie の SameSite 属性。
環境変数: |
|
|
|
状態 Cookie が存在する場合は、
環境変数: | boolean |
|
|
状態 Cookie は存在するが状態クエリーパラメーターが存在しない場合は、HTTP 401 エラーで失敗します。 複数の認証が無効になっているか、リダイレクト URL が元の要求 URL と一致する場合、OpenId Connect プロバイダーへの以前の失敗したリダイレクトからの古い状態 Cookie がブラウザーキャッシュに残り、現在の要求中に表示される可能性があります。たとえば、シングルページアプリケーション (SPA) が XHR を使用して、認可エンドポイントで CORS をサポートしていないプロバイダーへのリダイレクトを処理する場合、ブラウザーはそれをブロックし、Quarkus によって作成された状態 Cookie はブラウザーキャッシュに残ります。Quarkus は、このような古い状態 Cookie を検出したが、一致する状態クエリーパラメーターが見つからない場合に、認証失敗を報告します。
このような場合には、通常、HTTP 401 エラーを報告するのが適切です。これにより、ブラウザーのリダイレクトループのリスクが最小限に抑えられるだけでなく、SPA または Quarkus アプリケーションがリダイレクトを管理する方法の問題を特定することもできます。たとえば、このようなエラーを回避するには、
ただし、上記のオプションが適切でない場合は、このプロパティーを
環境変数: | boolean |
|
|
このプロパティーが
環境変数: | boolean |
|
|
セッションの有効期間を分単位で延長します。ユーザーセッションの有効期間プロパティーは、デフォルトで ID トークンの有効期間の値に設定され、セッションの有効期限が切れると、ユーザーは OIDC プロバイダーにリダイレクトされて再認証されます。このプロパティーがゼロ以外の値に設定されている場合は、セッションの有効期限が切れる前に期限切れの ID トークンを更新できます。
環境変数: |
| |
|
このプロパティーが
このプロパティーが
環境変数: | boolean |
|
|
認可コードフローが完了したときに ID トークンが使用可能であることを必須にします。ID トークンを返さない OAuth2 プロバイダーで認可コードフローを使用する必要がある場合にのみ、このプロパティーを無効にします。そのような場合には、内部 IdToken が生成されます。
環境変数: | boolean |
|
|
内部 ID トークンの有効期間。このプロパティーは、Oauth2 プロバイダーが IdToken を返さない場合に内部 IdToken が生成される場合にのみチェックされます。
環境変数: |
| |
|
Proof Key for Code Exchange (PKCE) の使用を必須にします。
環境変数: | boolean |
|
|
コードフロー状態で Proof Key for Code Exchange (PKCE) コードベリファイアまたは nonce、もしくはその両方を暗号化するために使用されるシークレット。このシークレットは少なくとも 32 文字の長さである必要があります。
このシークレットが設定されていない場合は、 これらすべてのプロパティーをチェックした後もシークレットが初期化されていない場合は、シークレットが自動生成されます。 シークレットの長さが 16 文字未満の場合、エラーが報告されます。
環境変数: | string | |
|
必須の
環境変数: |
| |
|
認可コードグラントリクエストを完了するために送信する必要があるカスタム HTTP ヘッダー。
環境変数: |
| |
|
デフォルトの TokenStateManager ストラテジー。
環境変数: | tooltip:keep-all-tokens[ID、アクセストークン、更新トークンを保持します。], tooltip:id-token[ID トークンのみを保持します], tooltip:id-refresh-tokens[ID トークンと更新トークンのみを保持します] |
|
|
デフォルトの TokenStateManager は、デフォルトで、認可コードグラントのレスポンスで返されたすべてのトークン (ID、アクセス、更新) を単一のセッション Cookie に保持します。このプロパティーを有効にすると、セッション Cookie のサイズが最小化されます
環境変数: | boolean |
|
|
デフォルトの TokenStateManager がトークンを保存するセッション Cookie を暗号化することを必須にします。
環境変数: | boolean |
|
|
このシークレットが設定されていない場合は、 トークンの暗号化に使用されるシークレットの長さは、少なくとも 32 文字である必要があります。シークレットの長さが 16 文字未満の場合、警告が記録されます。
環境変数: | string | |
|
トークンイントロスペクションデータのキャッシュを許可します。このプロパティーを有効にしても、キャッシュ自体は有効にならず、特定のテナントのトークンイントロスペクションのキャッシュのみが許可されることに注意してください。デフォルトのトークンキャッシュを使用できる場合は、
環境変数: | boolean |
|
|
ユーザー情報データのキャッシュを許可します。このプロパティーを有効にしても、キャッシュ自体は有効にならず、特定のテナントのユーザー情報データのキャッシュのみが許可されることに注意してください。デフォルトのトークンキャッシュを使用できる場合は、
環境変数: | boolean |
|
|
UserInfo をトークンキャッシュにキャッシュするのではなく、IdToken にインライン化できるようにします。このプロパティーは、Oauth2 プロバイダーが IdToken を返さない場合に内部 IdToken が生成される場合にのみチェックされます。生成された IdToken に UserInfo をインライン化すると、それをセッション Cookie に保存でき、キャッシュされた状態が導入されるのを回避できます。
環境変数: | boolean |
|
|
OIDC プロバイダーへの接続が初期化される瞬間に JWK 検証キーを取得する必要がある場合。 このプロパティーを無効にすると、現在のトークンを検証する必要がある瞬間までキーの取得が遅延となります。通常、これは、トークンまたはその他の関連付けられたリクエストプロパティーが、キーを正しく解決するために必要な追加のコンテキストを提供する場合にのみ必要になります。
環境変数: | boolean |
|
|
キャッシュできる JWK キーの最大数。
環境変数: | int |
|
|
JWK キーをキャッシュできる時間 (分)。
環境変数: |
| |
|
キャッシュタイマー間隔。このプロパティーが設定されている場合は、タイマーが定期的に古いエントリーをチェックして削除します。
環境変数: | ||
|
周知の OpenId Connect プロバイダー識別子
環境変数: |
|
duration の値を書き込むには、標準の java.time.Duration フォーマットを使用します。詳細は、Duration#parse() Java API ドキュメント を参照してください。
数字で始まる簡略化されたフォーマットも使用できます。
- 値が数値のみの場合は、秒単位の時間を表します。
-
数字の後に
msが続く値は、ミリ秒単位の時間を表します。
その他の場合は、解析のために簡略化されたフォーマットが java.time.Duration フォーマットに変換されます。
-
数字の後に
h、m、またはsが続く値には、接頭辞PTが付きます。 -
数字の後に
dが続く値は、接頭辞Pが付きます。
