3.5. テスト
別の OIDC のようなサーバーへの認証に関しては、テストが困難になることがよくあります。Quarkus は、モックから OIDC プロバイダーのローカル実行まで、さまざまなオプションを提供します。
まず、テストプロジェクトに次の依存関係を追加します。
Maven を使用する場合:
<dependency> <groupId>org.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("org.htmlunit:htmlunit") testImplementation("io.quarkus:quarkus-junit5")
3.5.1. Dev Services for Keycloak リンクのコピーリンクがクリップボードにコピーされました!
Keycloak に対する統合テストの場合は、Dev services for Keycloak を使用します。このサービスは、テストコンテナーを初期化し、quarkus レルムを作成して、シークレット secret を使用して quarkus-app クライアントを設定します。また、admin と user ロールを持つ alice と、user ロールを持つ bob の 2 人のユーザーも設定します。
まず、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 プロパティーがすでに設定されている場合は、quarkus.oidc.auth-server-url を prod プロファイルに関連付けます。これにより、Dev Services for Keycloak がコンテナーを期待どおりに起動できるようになります。以下に例を示します。
%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.2. 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:replaced-by-test-resource}/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 org.htmlunit.SilentCssErrorHandler;
import org.htmlunit.WebClient;
import org.htmlunit.html.HtmlForm;
import org.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.getForms().get(0);
// user 'alice' has the 'user' role
form.getInputByName("username").type("alice");
form.getInputByName("password").type("alice");
page = form.getButtonByName("login").click();
assertEquals("alice", page.getBody().asNormalizedText());
}
}
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.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 と入力して、アプリケーションのグローバルログレベルを変更します。