Die Keycloak-Konto-API gibt „Unauthorized 401“ mit einem Token von einem Benutzer zurück, der über meinen Spring-Client Java

Java-Forum
Guest
 Die Keycloak-Konto-API gibt „Unauthorized 401“ mit einem Token von einem Benutzer zurück, der über meinen Spring-Client

Post by Guest »

Ich denke, dem Client, den ich für die Spring-Sicherheit hinzugefügt habe, fehlt etwas, das der integrierte Admin-Client verwendet, wenn Sie die http://0.0.0.0:8080/realms/testrealm/account/ manuell besuchen und sich anmelden – Chrome-Entwicklungstools zeigt, dass die gleiche Art von Get-Anruf mit diesem Inhabertoken einwandfrei funktioniert. Anstatt ein Dienstkonto zum Aufrufen der Admin-API zu verwenden, würde ich lieber versuchen, die Konto-API mit dem Token zu verwenden, das ich bereits für den angemeldeten Benutzer habe. Dies scheint das bessere Prinzip der geringsten Sicherheit zu sein, da ich nur die Profilinformationen des aktuellen Benutzers abrufen/aktualisieren muss.
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;
}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post