如何通过执行操作电子邮件通过 keycloak admin rest api 更新密码

Posted

技术标签:

【中文标题】如何通过执行操作电子邮件通过 keycloak admin rest api 更新密码【英文标题】:How to update password via keyclaok admin rest api by execute-actions-email 【发布时间】:2017-06-23 14:59:46 【问题描述】:

我正在尝试在 keycloack 中触发密码重置过程,以便用户收到一封电子邮件以设置新密码。不幸的是,我总是得到 400 响应

com.fasterxml.jackson.databind.JsonMappingException:无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例 在 [来源:io.undertow.servlet.spec.ServletInputStreamImpl@89719e69;行:1,列:1]

我在描述的 api 上调用 keycloak:“PUT /admin/realms/realm/users/id/execute-actions-email”,对象如下:

"actions":["UPDATE_PASSWORD"]

见: http://www.keycloak.org/docs/rest-api/index.html#_send_a_update_account_email_to_the_user

【问题讨论】:

【参考方案1】:

正确的请求如下。

URL:http://HOSTNAME:PORT/auth/realms/REALM_NAME/users/USER_ID/execute-actions-email
HTTP-METHOD: PUT
BODY: ["UPDATE_PASSWORD"]
HEADERS: AUTHORIZATION BEARER TOKEN-GOES-HERE

【讨论】:

嗨@Alok Deshwal,在上述请求中,USER_ID 是用于登录帐户的用户名或电子邮件,还是 keycloak 用户 ID? @MohammedIdris 这是任何用户自动生成的密钥斗篷 ID 谢谢@Alok Deshwal,我如何确定领域的管理员用户?当我在邮递员中尝试时,我目前收到 401 Unauthorized 异常。 localhost:9080/auth/admin/realms/msme/users/… 我使用客户端 ID 和密码凭证从同一领域获得了令牌【参考方案2】:

对于所有想要为 execute-actions-email 编写 REST 调用的人,这里是工作代码 sn-p -

CloseableHttpClient httpclient = HttpClients.createDefault();
AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken(adminUserName, adminPassword);
String urlResetPassword = keyCloakURL+"/admin/realms/"+realmName+"/users/"+userId+"/execute-actions-email";
HttpPut putRequest = new HttpPut(urlResetPassword);
accessTokenResponse = authzClient.obtainAccessToken(adminUserName, adminPassword);
putRequest.addHeader("Authorization", "bearer "+accessTokenResponse.getToken());
putRequest.addHeader("content-type", MediaType.APPLICATION_JSON);
putRequest.setHeader("Accept", MediaType.APPLICATION_JSON);
StringEntity jSonEntity = new StringEntity("[\"UPDATE_PASSWORD\"]");
putRequest.setEntity(jSonEntity);
CloseableHttpResponse response = httpclient.execute(putRequest);

谢谢。

【讨论】:

【参考方案3】:

解决方案:仅使用 ["UPDATE_PASSWORD"] 作为您的请求的正文,它可以工作...

java 中的一个:Entity.json("[\"UPDATE_PASSWORD\"]");

【讨论】:

我们可以在发送更新密码电子邮件时更改 Keycloak 中的电子邮件模板吗?

以上是关于如何通过执行操作电子邮件通过 keycloak admin rest api 更新密码的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 API 在 keycloak 中忘记密码

如何通过ID获取其他用户信息(用户名,名字)? [Keycloak]

发送密码忘记邮件

Keycloak - 代理后的 URL 重置密码电子邮件

如何通过 id 获取其他用户信息(用户名、名字)? [钥匙斗篷]

Keycloak中“完成注册”信的“欢迎”