Is there an API call for changing user password on keycloak?

后端 未结 4 1390
没有蜡笔的小新
没有蜡笔的小新 2020-12-08 07:03

I am trying to implement my own form for changing a user\'s password. I tried to find an API for changing a user\'s password in Keycloak but I couldn\'t find anything in the

相关标签:
4条回答
  • 2020-12-08 07:19

    No, OAuth and OpenID Connect protocols doesn't define such feature and Keycloak also doesn't have ability to do this on user's behalf. There is a server-to-Server Admin API that alows to change the user's password or reset it but you can't call it from GUI. But the Keycloak provides some kind of "My Account Page" by url like http://localhost:8080/auth/realms/your-realm/account/ - replace your-realm part of URL and just redirect a user to it.

    In documentation it called User Account Service

    Also if you use auto discovery you can obtain the url by reading account-service from JSON by URL http://localhost:8080/auth/realms/your-realm

    0 讨论(0)
  • 2020-12-08 07:20

    Keycloak recently introduced this feature, but it's currently still in preview and therefore not documented.

    To make it work, you need to activate the account_api feature by starting keycloak with the parameter -Dkeycloak.profile.feature.account_api=enabled like so:

    bin/standalone.sh -Dkeycloak.profile.feature.account_api=enabled
    

    (source: https://www.keycloak.org/docs/latest/server_installation/index.html#profiles)

    After that, you can use POST /auth/realms/your-realm/account/credentials/password and provide the http Header Accept: application/json. The header will make keycloak use a RestAPI-Service which is accepting and returning JSON (instead of the default form-based one which is only accepting x-www-form-urlencoded and returns HTML.)

    As Request-Body, provide a JSON like this:

    {
        "currentPassword": "oldPassword",
        "newPassword": "newPassword",
        "confirmation": "newPassword"
    }
    

    A full example with curl would look like this:

    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"
    }'
    

    Note that - as written above - this feature is still in preview and might change in the future. So use it with caution!

    0 讨论(0)
  • 2020-12-08 07:30

    Rather than specifying a new password manually a better security practice is to use the

    PUT /auth/admin/realms/{realm}/users/{id}/execute-actions-email

    admin call with "UPDATE_PASSWORD" as the required action. This causes Keycloak to send an email to the user that gives a magic link for the user to set a new password.

    Note: {id} is the user id in keycloak (not the login)

    0 讨论(0)
  • 2020-12-08 07:32

    you can use PUT /auth/admin/realms/{realm}/users/{id}/reset-password

    • {id} is the user id in keycloak (not the login)

    Here is s sample body.

    { "type": "password", "temporary": false, "value": "my-new-password" }

    0 讨论(0)
提交回复
热议问题