首页 > 解决方案 > 无法使用 keycloak admin cli 端点接收客户端密钥

问题描述

我正在使用以下端点: http://localhost:8083/auth/admin/realms/Myrealm/clients/ltiobf/client-secret

并得到响应

{
  "error": "HTTP 401 Unauthorized"
}
    

我使用以下方法从 Keycloak 获取访问令牌:

curl --location --request POST 'http://localhost:8083/auth/realms/Myrealm/protocol/openid-connect/token' \
    --header 'cache-control: no-cache' \
    --header 'content-type: application/x-www-form-urlencoded' \
    --header 'postman-token: de7d68a0-5b21-1405-ed1a-9b7a6cb0da25' \
    --header 'Cookie: JSESSIONID=Sqb7zNt9Bk8OAx4vEjhjUDKQU_qw6K9B4jjJq69i.magistrate; XSRF-TOKEN=c620bf0f-a46a-41b4-bc30-558e96422123; JSESSIONID=gDz-86p4prmLkl12O7kx-8FdIcSAErBYhKitm5r8; JSESSIONID=Sqb7zNt9Bk8OAx4vEjhjUDKQU_qw6K9B4jjJq69i.magistratehq' \
    --data-urlencode 'client_id=ltiobf' \
    --data-urlencode 'username=sairaj1417' \
    --data-urlencode 'password=sairaj123' \
    --data-urlencode 'grant_type=password'

并将其作为身份验证参数传递给客户端密码的 GET 请求。

标签: javaspringspring-bootkeycloakkeycloak-services

解决方案


访问令牌应该是代表具有请求 Keycloak 省略的令牌的适当权限的用户请求的:

curl    -d "client_id=admin-cli" \
        -d "username=$ADMIN_NAME" \
        -d "password=$ADMIN_PASSWORD" \
        -d "grant_type=password" \
        https://$KEYCLOAK_IP/auth/realms/master/protocol/openid-connect/token

admin-cli作为客户ID。从该响应(Keycloak 令牌对象)中提取访问令牌,让我们命名为$ACCESS_TOKEN.

如果您有权访问Admin控制台,则可以通过以下方式轻松获得client secret

  • 你的Realm
  • 然后单击clients并选择您的client
  • 转到credentials您拥有的选项卡。

但是,如果你想使用 Keycloak Rest API 来做,首先你需要知道ID客户端的,可以使用:

curl -X GET https://<KEYCLOAK_IP>/auth/admin/realms/<REALM_NAME/clients?clientId=<CLIENT_ID> \ 
            -H "Authorization: bearer $ACCESS_TOKEN"

<CLIENT_ID>基本上是客户端名称)从您需要提取ID客户端所需的响应中。有了它,ID您可以提取客户端secret,使用:

curl -X GET https://<KEYCLOAK_IP>/auth/admin/realms/<REALM_NAME/clients/<ID of the client>/client-secret \ 
            -H "Authorization: bearer $ACCESS_TOKEN"

我在这个repo中创建了脚本来自动化这个过程,以便社区可以根据需要使用它们。


推荐阅读