3.5. テスト
別の OIDC のようなサーバーへの認証に関しては、テストが困難になることがよくあります。Quarkus は、モックから OIDC プロバイダーのローカル実行まで、さまざまなオプションを提供します。
まず、テストプロジェクトに次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <exclusions> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> <scope>test</scope> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency>
Gradle を使用する場合:
testImplementation("net.sourceforge.htmlunit:htmlunit") testImplementation("io.quarkus:quarkus-junit5")
3.5.1. Wiremock
次の依存関係を追加します。
Maven を使用:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-test-oidc-server</artifactId> <scope>test</scope> </dependency>
Gradle を使用する場合:
testImplementation("io.quarkus:quarkus-test-oidc-server")
REST テストエンドポイントを準備し、application.properties
を設定します。以下に例を示します。
# 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
最後に、次のようなテストコードを記述します。
import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import com.gargoylesoftware.htmlunit.SilentCssErrorHandler; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.oidc.server.OidcWiremockTestResource; @QuarkusTest @QuarkusTestResource(OidcWiremockTestResource.class) public class CodeFlowAuthorizationTest { @Test public void testCodeFlow() throws Exception { try (final WebClient webClient = createWebClient()) { // the test REST endpoint listens on '/code-flow' HtmlPage page = webClient.getPage("http://localhost:8081/code-flow"); HtmlForm form = page.getFormByName("form"); // user 'alice' has the 'user' role form.getInputByName("username").type("alice"); form.getInputByName("password").type("alice"); page = form.getInputByValue("login").click(); assertEquals("alice", page.getBody().asText()); } } private WebClient createWebClient() { WebClient webClient = new WebClient(); webClient.setCssErrorHandler(new SilentCssErrorHandler()); return webClient; } }
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
テストを実行する前にカスタムレルムファイルを Keycloak にインポートする必要がある場合は、次のようにして Dev Services for Keycloak
を設定できます。
%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 { }
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
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 dev
コンソールから j
と入力して、アプリケーションのグローバルログレベルを変更します。