Skip to content

Commit

Permalink
Bump org.keycloak:keycloak-quarkus-server from 22.0.2 to 22.0.3 (#57)
Browse files Browse the repository at this point in the history
* Bump org.keycloak:keycloak-quarkus-server from 22.0.2 to 22.0.3

Bumps org.keycloak:keycloak-quarkus-server from 22.0.2 to 22.0.3.

---
updated-dependencies:
- dependency-name: org.keycloak:keycloak-quarkus-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

* Use java http client because keycloak api in incompatible

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Stephan Schnabel <[email protected]>
  • Loading branch information
dependabot[bot] and sschnabe authored Sep 15, 2023
1 parent 79fada6 commit fab113d
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 35 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
version:
- 21.0.2
- 21.1.2
- 22.0.2
- 22.0.3
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
<!-- ============================== Libaries ============================= -->
<!-- ===================================================================== -->

<version.org.keycloak>22.0.2</version.org.keycloak>
<version.org.keycloak>22.0.3</version.org.keycloak>
<version.org.keycloak.test>${version.org.keycloak}</version.org.keycloak.test>
<version.org.testcontainers>1.18.3</version.org.testcontainers>

Expand Down
11 changes: 6 additions & 5 deletions src/test/java/io/kokuwa/keycloak/metrics/KeycloakIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.time.Instant;
Expand All @@ -18,6 +18,7 @@
import io.kokuwa.keycloak.metrics.junit.KeycloakClient;
import io.kokuwa.keycloak.metrics.junit.KeycloakExtension;
import io.kokuwa.keycloak.metrics.junit.Prometheus;
import jakarta.ws.rs.NotAuthorizedException;

/**
* Integration tests with Keycloak.
Expand Down Expand Up @@ -55,10 +56,10 @@ void loginAndAttempts(KeycloakClient keycloak, Prometheus prometheus) {
var loginErrorBefore1 = prometheus.userEvent(EventType.LOGIN_ERROR, realmName1, clientId1);
var loginErrorBefore2 = prometheus.userEvent(EventType.LOGIN_ERROR, realmName2, clientId2);

assertTrue(keycloak.login(clientId1, realmName1, username1, password1));
assertTrue(keycloak.login(clientId1, realmName1, username1, password1));
assertTrue(keycloak.login(clientId2, realmName2, username2, password2));
assertFalse(keycloak.login(clientId2, realmName2, username2, "nope"));
assertDoesNotThrow(() -> keycloak.login(clientId1, realmName1, username1, password1));
assertDoesNotThrow(() -> keycloak.login(clientId1, realmName1, username1, password1));
assertDoesNotThrow(() -> keycloak.login(clientId2, realmName2, username2, password2));
assertThrows(NotAuthorizedException.class, () -> keycloak.login(clientId2, realmName2, username2, "nope"));

prometheus.scrap();
var loginAfter = prometheus.userEvent(EventType.LOGIN);
Expand Down
74 changes: 47 additions & 27 deletions src/test/java/io/kokuwa/keycloak/metrics/junit/KeycloakClient.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
package io.kokuwa.keycloak.metrics.junit;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.keycloak.OAuth2Constants;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.token.TokenService;
import org.keycloak.representations.AccessTokenResponse;
import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.UserRepresentation;

import jakarta.ws.rs.NotAuthorizedException;
import com.fasterxml.jackson.databind.ObjectMapper;

import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedHashMap;

/**
Expand All @@ -25,11 +36,18 @@
public class KeycloakClient {

private final Keycloak keycloak;
private final TokenService token;
private final TokenService tokenService;

private final ObjectMapper mapper = new ObjectMapper();
private final HttpClient client = HttpClient.newHttpClient();
private final String url;
private final String adminToken;

KeycloakClient(Keycloak keycloak, TokenService token) {
KeycloakClient(String url, Keycloak keycloak, TokenService tokenService) {
this.keycloak = keycloak;
this.token = token;
this.tokenService = tokenService;
this.url = url;
this.adminToken = login("admin-cli", "master", "admin", "password").getToken();
}

public void createRealm(String realmName) {
Expand All @@ -52,18 +70,25 @@ public void createClient(String realmName, String clientId) {
}

public void createUser(String realmName, String username, String password) {
var credential = new CredentialRepresentation();
credential.setType(CredentialRepresentation.PASSWORD);
credential.setValue(password);
credential.setTemporary(false);
var user = new UserRepresentation();
user.setEnabled(true);
user.setEmail(username + "@example.org");
user.setEmailVerified(true);
user.setUsername(username);
user.setCredentials(List.of(credential));
var response = keycloak.realms().realm(realmName).users().create(user);
assertEquals(201, response.getStatus());
try {
var response = client.send(HttpRequest.newBuilder()
.uri(URI.create(url + "/admin/realms/" + realmName + "/users"))
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, "Bearer " + adminToken)
.POST(BodyPublishers.ofString(mapper.writeValueAsString(Map.of(
"enabled", true,
"emailVerified", true,
"email", username + "@example.org",
"username", username,
"credentials", List.of(Map.of(
"type", CredentialRepresentation.PASSWORD,
"value", password,
"temporary", false))))))
.build(), BodyHandlers.ofString());
assertEquals(201, response.statusCode(), "Body: " + response.body());
} catch (IOException | InterruptedException e) {
fail("Failed to create user", e);
}
}

public void deleteUser(String realmName, String username) {
Expand All @@ -73,16 +98,11 @@ public void deleteUser(String realmName, String username) {
.forEach(keycloak.realms().realm(realmName).users()::delete);
}

public boolean login(String clientId, String realmName, String username, String password) {
try {
token.grantToken(realmName, new MultivaluedHashMap<>(Map.of(
OAuth2Constants.CLIENT_ID, clientId,
OAuth2Constants.GRANT_TYPE, OAuth2Constants.PASSWORD,
OAuth2Constants.USERNAME, username,
OAuth2Constants.PASSWORD, password)));
return true;
} catch (NotAuthorizedException e) {
return false;
}
public AccessTokenResponse login(String clientId, String realmName, String username, String password) {
return tokenService.grantToken(realmName, new MultivaluedHashMap<>(Map.of(
OAuth2Constants.CLIENT_ID, clientId,
OAuth2Constants.GRANT_TYPE, OAuth2Constants.PASSWORD,
OAuth2Constants.USERNAME, username,
OAuth2Constants.PASSWORD, password)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public void beforeAll(ExtensionContext context) throws Exception {
var target = ClientBuilder.newClient().target(url);
var token = Keycloak.getClientProvider().targetProxy(target, TokenService.class);
prometheus = new Prometheus(Keycloak.getClientProvider().targetProxy(target, PrometheusClient.class));
client = new KeycloakClient(keycloak, token);
client = new KeycloakClient(url, keycloak, token);
}

@Override
Expand Down

0 comments on commit fab113d

Please sign in to comment.