Получение 400 неверных запросов от Rest API для Keycloak с включенным согласием
Я осознаю HTTP 400 Bad Request
из ключевого кода Java, пока Consent Required
установлен как ON
. Я использую следующий код:
String realm = authenticationData.getRealm();
String clientName = authenticationData.getClientName();
String userName = authenticationData.getUserName();
String secret = authenticationData.getSecret();
String password = authenticationData.getPassword();
String authServerURL = authenticationData.getAuthServerURL();
ResteasyClient resteasyClient = new ResteasyClientBuilder().connectionPoolSize(10).register(new CustomJacksonProvider()).build();
Keycloak keycloak = KeycloakBuilder.builder()
.serverUrl(authServerURL)
.realm(realm)
.grantType(OAuth2Constants.PASSWORD)
.clientId(clientName)
.clientSecret(secret)
.username(userName)
.password(password)
.resteasyClient(resteasyClient)
.build();
String authToken = keycloak.tokenManager().getAccessToken().getToken();
Я использовал следующие библиотеки в файле Gradle.
compile 'org.keycloak:keycloak-adapter-core:7.0.0'
compile 'org.keycloak:keycloak-servlet-filter-adapter:7.0.0'
compile 'org.keycloak:keycloak-authz-client:7.0.0'
compile 'org.keycloak:keycloak-admin-client:7.0.0'
compile 'org.keycloak:keycloak-core:7.0.0'
с сервером как Server Version 7.0.0
Примечание: я пробовал тот же код сConsent Required
установить как OFF
и это работает.
1 ответ
"Требуется согласие" означает, что пользователь сначала должен дать согласие на использование этих данных. Пока пользователь не согласился, вы получите "400". IDP-Server сообщает: "Я не могу предоставить вам данные (потому что пользователю это не нужно)". При обычном входе в систему на основе экрана IDP будет показывать пользователю веб-сайт, чтобы дать согласие. Но с REST это, очевидно, невозможно.
Также "Согласие" не входит в объем логина. Он принадлежит учетной записи пользователя. Пользователь однажды дает свое согласие, затем согласие сохраняется в его учетной записи. Вот почему вы не можете установить согласие при входе в систему. НО вы можете изменить согласие через REST-Api. Посмотрите на пакет
org.keycloak.services.resources.account.AccountRestService
метод
AccountRestService.updateConsent(String clientId, ConsentRepresentation consent)
(см. здесь API). Это может быть то, что вы хотите.
Также здесь можно найти документы https://issues.redhat.com/browse/KEYCLOAK-10653.
И не забывайте, что вам нужно войти в систему как admin(-like), чтобы изменить данные пользователя.