使用客户端机密调用KeyCloak的Admin REST API

时间:2017-02-28 13:13:21

标签: keycloak

从Docker镜像运行KeyCloak时,https://keycloak.gitbooks.io/server-developer-guide/content/v/2.2/topics/admin-rest-api.html使用CURL的示例对我有用。

要转向我的应用程序的最终目标形状,我想使用客户端ID和机密而不是用户名+密码进行身份验证。

但是,当我将admin-cli客户端切换到“已启用服务帐户”时,访问类型为机密,并通过以下调用获取令牌:

curl -d "client_id=admin-cli" -d "client_id=admin-cli" -d "client_secret=xxxx" -d "grant_type=client_credentials" "http://localhost:8080/auth/realms/master/protocol/openid-connect/token"

该令牌导致调用admin REST API时出现403错误。我做错了什么?

4 个答案:

答案 0 :(得分:4)

以下是我在admin-cli上实现client_credentials的方法:

  1. 启用'服务帐户'如你所说
  2. 设置'访问类型'保密 - 这使它能够使用client_secret并分配秘密(凭证标签)。
  3. on'服务帐户'选项卡,从领域管理客户端角色授予服务帐户领域管理员角色
  4. 由于我是针对特定领域下的admin-cli客户端执行此操作,因此您可以从“#master”中更改领域'无论你的领域是什么,在我看来是EEC-RLM:

    http://192.168.101.139:8080/auth/realms/EEC-RLM/protocol/openid-connect/token

    为了完整起见,当您致电管理员uri时,您将授权标头设置为“承载者访问权限”和“#39;承载者访问权限”。其中access_token是从上面的/ token uri返回的access_token。在我的情况下,我打电话:

    http://192.168.101.139:8080/auth/admin/realms/EEC-RLM/users

    当文档与要调用的实际URL相关时,文档不一定特别清楚:我最初认为这些操作总是在主域上,但事实并非如此。

答案 1 :(得分:1)

当像这样的客户端进行身份验证时,客户端的服务帐户需要被授予适当的角色(例如' admin')。这可以在"服务帐户角色"客户端的KeyCloak管理员中的选项卡。

答案 2 :(得分:1)

我遇到了同样的问题,一段时间后我发现了(顺便说一句,我正在使用keycloak v7.0.0)。

这是您需要做的:

  • 将新的机密客户端添加到 master
  • 领域
  • 对于该客户端,启用选项Service Accounts Enabled
  • 向该客户添加新的“硬编码声明”
    • 名称:您想要的任何名称
    • 代币声明名称: azp
    • 索赔值: admin-cli

它应该像这样:

Hardcoded claim description

最后,转到“服务帐户角色”标签,然后将角色“ admin”(或所需的角色)分配给客户端服务客户端。

enter image description here

在那之后,您可以获取一个为您的客户端创造的管理令牌,并将其用于Admin REST API。

#!/usr/bin/env python
import requests
import json

headers = {"Content-Type": "application/x-www-form-urlencoded"}
url = "https://localhost:8080/auth/realms/master/protocol/openid-connect/token"
session = requests.Session()

grant_type='client_credentials'

client_id = "super-client"              # change this one
client_secret = "super-client-secret"   # change this one

payload = "scope=openid&client_id={0}&grant_type={1}&client_secret={2}".format(
            client_id, grant_type, client_secret)

ret = session.post(url=url, headers=headers, data=payload)
token_object = json.loads(ret.text)
print (token_object['access_token'])

答案 3 :(得分:0)

您可以使用细粒度的管理员权限将管理员权限限制为仅配置客户端,而不是将整个领域的权限授予客户端:https://www.keycloak.org/docs/latest/server_admin/#_fine_grain_permissions