Получение 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), чтобы изменить данные пользователя.

Другие вопросы по тегам