如果存在"Required User Actions"则登录



如果现有的KeyCloak用户有一个或多个必需的用户操作,我会遇到以下问题。

我们使用 keycloak (3.4.2.Final) rest api 登录 keycloak。但是,如果用户被锁定或存在任何所需的用户操作,则 keycloak 始终返回代码 401 (invalid_grant)。所以我无法确定主要问题是什么。

对于锁定,我不需要验证用户的密码,使用任何密码(调用攻击检测 rest api)我可以告诉最终用户帐户已锁定,但对于所需的用户操作不同,用户必须成功登录,然后我可以处理后续步骤。

例如UPDATE_PASSWORD:

使用用户名/密码登录 -> 登录成功或用户名/密码验证 ->处理用户操作 ->更新密码 ->用户登录

我将不胜感激任何想法。

以防万一有人仍然关心答案: 您可以使用 keycloak 的管理员 REST API 更新用户。

PUT/auth/admin/realms/myrealm/users/myKeycloakUserId { "id": "myKeycloakUserId", "创建时间戳":1547730135139, "用户名": "我的用户名", "已启用":真, "totp":假, "电子邮件已验证":真, "名字": "我的名字", "姓氏": "我的姓氏", "电子邮件": "我的电子邮件", "属性":{ "隐私声明接受日期":[ "2019-01-17T13:02:15.189Z" ], "欢迎电子邮件日期": [ "2019-01-17T13:02:30.370Z" ], "性别":[ "女" ], "法定年龄确认日期":[ "2019-01-17T13:02:15.189Z" ], "条款接受日期":[ "2019-01-17T13:02:15.189Z" ] }, "可禁用凭据类型":[ "密码" ], "必需的操作": [], "notBefore": 0, "访问":{ "管理组成员资格":真, "视图":真, "映射角色":真, "冒充":真, "管理":真 } }

有人可能想尝试只发送所需的 Actions-属性而不是所有其他值(因为这些值应该首先检索),但我不知道这是否真的有效。我想:安全总比后悔好,所以我先检索数据,然后我只将 requiredActions-属性设置为空数组并将其发回。

如果您使用的是 Java 客户端库(keycloak-admin-client),则可以这样做:

org.keycloak.admin.client.Keycloak keycloak = KeycloakBuilder.builder()
.serverUrl(KEYCLOAK_ADMIN_BASEURL))
.realm(KEYCLOAK_ADMIN_REALM))
.grantType(OAuth2Constants.CLIENT_CREDENTIALS)
.clientId(KEYCLOAK_ADMIN_CLIENTID))
.clientSecret(KEYCLOAK_ADMIN_CLIENTSECRET))
.build();
final UserResource keycloakUserResource = keycloak.realm(
configurationService.getValue(KEYCLOAK_ADMIN_REALM)).users().get(
keycloakUserId);
//load the users user-representation from Keycloak
final UserRepresentation userRepresentation = keycloakUserResource.toRepresentation();
if (userRepresentation == null) {
throw new Exception("Failed to load the UserRepresentation for the current User");
}
//adapt the user-representation
userRepresentation.setRequiredActions(Collections.emptyList());
//update user in Keycloak
keycloakUserResource.update(userRepresentation);

最新更新