从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错误。我做错了什么?
答案 0 :(得分:4)
以下是我在admin-cli上实现client_credentials的方法:
由于我是针对特定领域下的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)。
这是您需要做的:
Service Accounts Enabled
它应该像这样:
最后,转到“服务帐户角色”标签,然后将角色“ admin”(或所需的角色)分配给客户端服务客户端。
在那之后,您可以获取一个为您的客户端创造的管理令牌,并将其用于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