Я думаю, что в клиенте, который я добавил для безопасности 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
API учетной записи Keycloak возвращает несанкционированный код 401 с токеном от пользователя, вошедшего в систему через ⇐ JAVA
Программисты JAVA общаются здесь
1736847465
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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78738348/keycloak-account-api-returns-unauthorized-401-with-token-from-user-logged-in-via[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия