#java #automated-tests #keycloak #openid-connect #htmlunit
Вопрос:
Я создал логин OpenID Connect для своего java-приложения (без spring). Теперь я хочу провести автоматический тест для процесса OIDC. Я использую KeyCloak в качестве сервера аутентификации. Для OIDC мой тест должен войти на страницу входа в систему keyloak, введя имя пользователя и пароль. Для этого я использую HtmlUnit и простой http-сервер для перенаправления.
// Setup http-server to recieve the code from the redirect
HttpServer server = HttpServer.create(new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), 8001), 0);
server.createContext("/oidc_test_callback", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
String url = exchange.getRequestURI().toString();
String parameter = "code=";
String codeValue = url.substring(url.indexOf(parameter) parameter.length());
// continue the test with the code
}
});
server.setExecutor(null);
server.start();
// login with the dummy-user on the keyloak loginpage
String url = ...; // the URL looks like http://keycloak:8080/auth/realms/testRealm/protocol/openid-connect/auth?client_id=myAppNameamp;redirect_uri=http://192.168.202.102:8001/oidc_test_callbackamp;response_type=codeamp;scope=openid profileamp;state=7944e52a-467a-4000-874b-ea4991dbeaebamp;nonce=somecorrelationnonceamp;login_hint=amp;acr_values=
try (WebClient webClient = new WebClient()) {
webClient.getOptions().setCssEnabled(true);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage(url);
HtmlForm form = (HtmlForm) page.getElementById("kc-form-login");
HtmlTextInput inputUsername = form.getInputByName("username");
HtmlPasswordInput inputPassword = (HtmlPasswordInput) form.getInputByName("password");
inputUsername.type("admin");
inputPassword.type("admin");
HtmlSubmitInput buttonLogin = (HtmlSubmitInput) form.getInputByName("login");
buttonLogin.click();
} catch (Exception ex) {
Assertions.fail(ex);
}
Когда я запускаю этот код, http-сервер ничего не получает. Похоже, кнопка входа в систему не выполняется должным образом.
Вот html-код со страницы входа в keycloak:
<div id="kc-form">
<div id="kc-form-wrapper">
<form id="kc-form-login" onsubmit="login.disabled = true; return true;" action="http://keycloak:8080/auth/realms/testRealm/login-actions/authenticate?session_code=dIFFDFXC9YsXhiR0PLdfOjj-YcV-j_rZWr5DBVkQ8UUamp;amp;execution=108fb093-287d-4c18-b4a9-10a162e908caamp;amp;client_id=UMS_Loginserveramp;amp;tab_id=tKYHYQvKb70" method="post">
<div class="form-group">
<label for="username" class="pf-c-form__label pf-c-form__label-text">Username or email</label>
<input tabindex="1" id="username" class="pf-c-form-control" name="username" value="" type="text" autofocus autocomplete="off"
aria-invalid=""
/>
</div>
<div class="form-group">
<label for="password" class="pf-c-form__label pf-c-form__label-text">Password</label>
<input tabindex="2" id="password" class="pf-c-form-control" name="password" type="password" autocomplete="off"
aria-invalid=""
/>
</div>
<div class="form-group login-pf-settings">
<div id="kc-form-options">
</div>
<div class="">
</div>
</div>
<div id="kc-form-buttons" class="form-group">
<input type="hidden" id="id-hidden-input" name="credentialId" />
<input tabindex="4" class="pf-c-button pf-m-primary pf-m-block btn-lg" name="login" id="kc-login" type="submit" value="Sign In"/>
</div>
</form>
</div>
</div>
Комментарии:
1. Пожалуйста, проверьте журнал, возможно, кнопка не видна из-за какого-то css.
Ответ №1:
Я решил это сам, передав правильные учетные данные пользователя……пароль был «admin1».