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

Dav*_*rth 8 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"
Run Code Online (Sandbox Code Playgroud)

该令牌导致调用管理REST API时出现403错误.我做错了什么吗?

小智 6

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

  1. 如您所说启用“服务帐户”
  2. 将“访问类型”设置为机密-这使它可以使用client_secret并分配机密(“凭据”选项卡)。
  3. 在“服务帐户”选项卡上,从领域管理客户端角色向服务帐户授予领域管理员角色

由于我是在特定域下为admin-cli客户端执行此操作的,因此您可以将域从“主”更改为您的域,在我的情况下为EEC-RLM:

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

为了完整起见,当您调用admin uri时,需要将Authorization标头设置为“ Bearer access_token”,其中access_token是从/ token uri返回的access_token。就我而言,我打电话给:

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

该文档在与实际要调用的URL相关时不一定特别明确:例如,我最初以为这些操作始终在主领域中,而事实并非如此。


Dav*_*rth 3

当像这样作为客户端进行身份验证时,需要向客户端的服务帐户授予适当的角色(例如“管理员”)。这可以在客户端 KeyCloak 管理中的“服务帐户角色”选项卡上完成。