我正在尝试实现我自己的表单来更改用户的密码。我试图在 Keycloak 中找到用于更改用户密码的 API,但在文档中找不到任何内容。有没有 API 可以做到这一点?
7 回答
您可以使用PUT /auth/admin/realms/{realm}/users/{id}/reset-password
- {id} 是 keycloak 中的用户 ID(不是登录名)
这是样本主体。
{ "type": "password", "temporary": false, "value": "my-new-password" }
更新密钥斗篷 12
下面描述的解决方案将不再适用于 Keycloak 版本 12 或更高版本,因为开发人员决定删除所有 Account Rest API ,如本期所述。
感谢@Radivarig 指出这一点!
Keycloak 11 的解决方案
Keycloak 最近推出了此功能,但目前仍处于预览阶段,因此没有记录。
要使其工作,您需要account_api
通过使用如下参数启动 keycloak 来激活该功能-Dkeycloak.profile.feature.account_api=enabled
:
bin/standalone.sh -Dkeycloak.profile.feature.account_api=enabled
(来源:https ://www.keycloak.org/docs/latest/server_installation/index.html#profiles )
之后,您可以使用POST /auth/realms/your-realm/account/credentials/password
并提供 http Header Accept: application/json
。标头将使 keycloak 使用接受并返回 JSON 的 RestAPI-Service(而不是仅接受x-www-form-urlencoded
并返回 HTML 的默认基于表单的服务。)
作为Request-Body,提供这样的 JSON:
{
"currentPassword": "oldPassword",
"newPassword": "newPassword",
"confirmation": "newPassword"
}
curl 的完整示例如下所示:
curl --request POST 'https://path-to-your-host.com/auth/realms/your-realm/account/credentials/password' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"currentPassword": "oldPassword",
"newPassword": "newPassword",
"confirmation": "newPassword"
}'
请注意 - 如上所述 - 此功能仍处于预览阶段,将来可能会更改。所以请谨慎使用!
与手动指定新密码相比,更好的安全做法是使用
PUT /auth/admin/realms/{realm}/users/{id}/execute-actions-email
管理员调用"UPDATE_PASSWORD"
作为所需的操作。这会导致 Keycloak 向用户发送一封电子邮件,该电子邮件为用户提供了一个魔术链接以设置新密码。
注意:{id} 是 keycloak 中的用户 id(不是登录名)
正如Keycloak Admin REST API建议的那样,您可以发送PUT
请求以keycloakEndpoint/auth/{realm}/users/{id}/execute-actions-email
对用户执行操作。您需要按照此处所述获取管理员访问令牌
TL;DR:通过网络应用程序更好的方法
keycloak.login({
action: "UPDATE_PASSWORD",
})
欲了解更多信息:https ://www.keycloak.org/docs/latest/securing_apps/#login-options
不,OAuth 和 OpenID Connect 协议没有定义此类功能,Keycloak 也无法代表用户执行此操作。有一个服务器到服务器的管理 API,可以更改用户密码或重置密码,但您不能从 GUI 调用它。但是 Keycloak 通过 url 提供了某种“我的帐户页面”,例如http://localhost:8080/auth/realms/your-realm/account/
- 替换your-realm
部分 URL 并将用户重定向到它。
在文档中它称为用户帐户服务
此外,如果您使用自动发现,您可以account-service
通过 URL 从 JSON读取来获取 urlhttp://localhost:8080/auth/realms/your-realm
:-)
#!/bin/bash
#CHANGE ADMIN PASSWORD
apt update
apt install -y curl jq
KEYCLOAK_HOST=http://127.0.0.1:8080
ADMIN_USER_OLD_PASSWORD=
ADMIN_USER_NEW_PASSWORD=
TOKEN=$(curl -s -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d "username=admin&password=$ADMIN_USER_OLD_PASSWORD&client_id=admin-cli&grant_type=password" "$KEYCLOAK_HOST/auth/realms/master/protocol/openid-connect/token" | jq -r ".access_token" ;)
ADMIN_USER_ID=$(curl -s -X GET -H "Authorization: Bearer $TOKEN" -H "Content-type: application/json;charset=UTF-8" -H 'Accept: application/json' "$KEYCLOAK_HOST/auth/admin/realms/master/users" | jq -r '.[] | select(.username=="admin") | .id' )
curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-type: application/json;charset=UTF-8" -H 'Accept: application/json' "$KEYCLOAK_HOST/auth/admin/realms/master/users/$ADMIN_USER_ID/reset-password" -d "{\"type\":\"password\",\"value\":\"$ADMIN_USER_NEW_PASSWORD\",\"temporary\":false}"