Keycloak 调用keydove';s使用客户端机密的管理RESTAPI

Keycloak 调用keydove';s使用客户端机密的管理RESTAPI,keycloak,Keycloak,从Docker映像运行KeyClope时,使用CURL at的示例适用于我 为了实现应用程序的最终目标形状,我希望使用客户机ID和密码而不是用户名+密码进行身份验证 但是,当我将admin cli客户端切换到“已启用服务帐户”时,访问类型为机密,并通过以下调用获取令牌: curl -d "client_id=admin-cli" -d "client_id=admin-cli" -d "client_secret=xxxx" -d "grant_type=client_credentials"

从Docker映像运行KeyClope时,使用CURL at的示例适用于我

为了实现应用程序的最终目标形状,我希望使用客户机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"

该令牌导致对AdminRESTAPI的调用出现403错误。我做错了什么吗?

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

以下是我如何在admin cli上实现客户端凭据:

  • 如您所说启用“服务帐户”
  • 将“访问类型”设置为机密-这将使其能够使用客户端机密并分配机密(凭据选项卡)
  • 在“服务帐户”选项卡上,从领域管理客户端角色向服务帐户授予领域管理员角色
  • 由于我是在特定领域下为admin cli客户端执行此操作的,因此您可以将领域从“主”更改为您的任何领域,在我的示例EEC-RLM中:

    为了完整性,当您调用admin uri时,您将把授权头设置为“Bearer access\u token”,其中access\u token是从上面的/token uri返回的access\u token。就我而言,我呼吁:


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

    我也遇到了同样的问题,经过一段时间后,我发现了这个问题(顺便说一句,我使用的是KeyClope v7.0.0)

    这是您需要做的:

    • 将新的机密客户端添加到域主机
    • 对于该客户端,启用选项
      服务帐户已启用
    • 在“映射器”选项卡上,创建新的自定义“受众”映射器:
      • 名称:
        aud映射器
      • 映射器类型:
        受众
      • 包括客户端观众:
        安全管理控制台
    应该是这样的:

    最后,转到“服务帐户角色”选项卡,并将角色“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'])
    
    此外,在“客户机范围”选项卡中,“角色”范围应添加到默认范围,或添加到可选范围,并在请求访问令牌时设置为范围的“角色”。