Was ist der Hauptunterschied zwischen dem Client meiner Spring-Boot-App, der den Autorisierungscodefluss nach Spring-Sicherheitsstandard verwendet? um das Token des angemeldeten Benutzers im Sicherheitskontext zu speichern, und jedoch den integrierten Keycloak-"Konto"-Client, der anscheinend auch den gleichen Standard-Authentifizierungscodefluss hat, der es den Benutzern ermöglicht, sich anzumelden, aber seine Token erhalten nicht 401 und meine tun..??
Wenn es hilft, hier ist der Code, den ich verwende, um das Token zu holen und den Konto-GET-Aufruf damit zu veranlassen, aber ich denke, das Problem liegt irgendwie bei meinem Realm /Client-Konfiguration. Ich habe versucht, die Rolle „View-Profil“ zu kopieren, aber ich verstehe nicht, warum das wichtig ist – es sieht nur aus wie eine Zeichenfolgenbezeichnung.
Was fehlt mir? Dies ist Keycloak 24.0.0, das lokal ausgeführt wird.
Code: Select all
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.spi.ResteasyClientProvider;
import org.keycloak.representations.idm.UserRepresentation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.stereotype.Service;
import org.jboss.resteasy.client.jaxrs.*;
@Service
public class KeycloakUserService {
@Value("${keycloak.auth-server-url}")
private String serverUrl;
@Value("${keycloak.realm}")
private String realm;
public UserRepresentation getCurrentUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
OidcUser oidcUser = (OidcUser) authentication.getPrincipal();
String accessToken = oidcUser.getIdToken().getTokenValue();
String userId = oidcUser.getSubject();
String url = serverUrl + "/realms/{realm}/account/";
ResteasyClientProvider clientProvider = Keycloak.getClientProvider();
ResteasyClient client = (ResteasyClient) clientProvider.newRestEasyClient(null, null, false);
ResteasyWebTarget target = client.target(url).resolveTemplate("realm", realm);
System.out.println("URL: " + url);
Response response = target.request(MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)
.property("userProfileMetadata","true")
.get();
if (response.getStatus() == 200) {
return response.readEntity(UserRepresentation.class);
} else {
// Handle errors appropriately
System.out.println("Error: " + response.getStatus());
String errorMessage = response.readEntity(String.class);
System.out.println("Error Message: " + errorMessage);
return null;
}
}