![](/img/trans.png)
[英]Is there any possibility to OTP validation for changing user password (by API call) on keycloak?
[英]Is there an API call for changing user password on keycloak?
我正在嘗試實現我自己的表單來更改用戶的密碼。 我試圖找到一個 API 來更改 Keycloak 中的用戶密碼,但我在文檔中找不到任何內容。 是否有 API 可以這樣做?
你可以使用PUT /auth/admin/realms/{realm}/users/{id}/reset-password
這是樣本體。
{ "type": "password", "temporary": false, "value": "my-new-password" }
下面描述的解決方案將不再適用於 Keycloak 版本 12 或更高版本,因為開發人員決定刪除所有帳戶休息 API ,如本期所述。
感謝@Radivarig 指出這一點!
Keycloak 最近引入了此功能,但目前仍處於預覽階段,因此沒有記錄。
要使其工作,您需要通過使用參數-Dkeycloak.profile.feature.account_api=enabled
啟動 keycloak 來激活account_api
功能,如下所示:
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:通過 Web 應用程序實現的更好方法
keycloak.login({
action: "UPDATE_PASSWORD",
})
欲了解更多信息: https : //www.keycloak.org/docs/latest/securing_apps/#login-options
:-)
#!/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}"
constructor(
private keycloakService: KeycloakService,
) { }
onPasswordChangeButtonClick(){
this.keycloakService.login({
action: "UPDATE_PASSWORD",
});
}
請嘗試此方法更改密碼
這對我有用:https://github.com/keycloak/keycloak/pull/7393#issuecomment-1103532595
但是你必須看看你是否可以使用自定義主題,如果你想要一個不同於 keycloak 默認的形式。
不,OAuth 和 OpenID Connect 協議未定義此類功能,Keycloak 也無法代表用戶執行此操作。 有一個服務器到服務器管理 API,允許更改用戶密碼或重置密碼,但您不能從 GUI 調用它。 但是 Keycloak 通過像http://localhost:8080/auth/realms/your-realm/account/
這樣的 url 提供某種“我的帳戶頁面” - 替換 URL 的your-realm
部分並將用戶重定向到它。
在文檔中它稱為用戶帳戶服務
此外,如果您使用自動發現,您可以通過 URL http://localhost:8080/auth/realms/your-realm
從 JSON 讀取account-service
來獲取 URL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.