88 lines
2.8 KiB
Java
88 lines
2.8 KiB
Java
package io.kokuwa.keycloak.metrics.junit;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
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.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 jakarta.ws.rs.core.MultivaluedHashMap;
|
|
|
|
/**
|
|
* Client for keycloak.
|
|
*
|
|
* @author Stephan Schnabel
|
|
*/
|
|
public class KeycloakClient {
|
|
|
|
private final Keycloak keycloak;
|
|
private final TokenService token;
|
|
|
|
KeycloakClient(Keycloak keycloak, TokenService token) {
|
|
this.keycloak = keycloak;
|
|
this.token = token;
|
|
}
|
|
|
|
public void createRealm(String realmName) {
|
|
var realm = new RealmRepresentation();
|
|
realm.setId(UUID.randomUUID().toString());
|
|
realm.setEnabled(true);
|
|
realm.setRealm(realmName);
|
|
realm.setEventsListeners(List.of("metrics-listener"));
|
|
keycloak.realms().create(realm);
|
|
}
|
|
|
|
public void createClient(String realmName, String clientId) {
|
|
var client = new ClientRepresentation();
|
|
client.setId(UUID.randomUUID().toString());
|
|
client.setClientId(clientId);
|
|
client.setPublicClient(true);
|
|
client.setDirectAccessGrantsEnabled(true);
|
|
var response = keycloak.realms().realm(realmName).clients().create(client);
|
|
assertEquals(201, response.getStatus());
|
|
}
|
|
|
|
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());
|
|
}
|
|
|
|
public void deleteUser(String realmName, String username) {
|
|
keycloak.realms().realm(realmName).users()
|
|
.searchByUsername(username, true).stream()
|
|
.map(UserRepresentation::getId)
|
|
.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;
|
|
}
|
|
}
|
|
}
|