API учетной записи Keycloak возвращает несанкционированный код 401 с токеном от пользователя, вошедшего в систему через JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 API учетной записи Keycloak возвращает несанкционированный код 401 с токеном от пользователя, вошедшего в систему через

Сообщение Anonymous »

Я думаю, что в клиенте, который я добавил для безопасности Spring, отсутствует что-то, что использует встроенный клиент администратора, когда вы посещаете http://0.0.0.0:8080/realms/testrealm/account/ вручную и входите в систему - инструменты разработчика Chrome. показывает, что тот же тип вызова get отлично работает с этим токеном-носителем. Вместо того, чтобы использовать учетную запись службы для вызова API администратора, я бы предпочел попытаться использовать API учетной записи с уже имеющимся у меня токеном для вошедшего в систему пользователя. Это кажется лучшим принципом наименьшей безопасности, поскольку мне нужно только получить/обновить информацию о профиле текущего пользователя.
В чем ключевое различие между клиентом моего приложения Spring Boot, использующим стандартный поток кода авторизации Spring Security? для хранения токена вошедшего в систему пользователя в контексте безопасности и, однако, встроенного клиента «учетной записи» keycloak, который, кажется, также имеет тот же стандартный поток кода аутентификации, который позволяет пользователям входить в систему, но его токены не получают 401 и мой..??
Если это поможет, вот код, который я использую, чтобы получить токен и сделать GET-вызов учетной записи с его помощью, но я думаю, что проблема в чем-то с моей конфигурацией области/клиента. Я попытался скопировать роль view-profile, но не понимаю, какое это имеет значение — выглядит просто строковой меткой.
Что мне не хватает? Это keycloak 24.0.0, работающий локально.
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;
}

}


Подробнее здесь: https://stackoverflow.com/questions/787 ... ged-in-via
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»