如何解决-Keycloak-客户端不允许交换

dra*_*gon 4 keycloak token-exchange

我尝试从文档中实现Keycloak直接裸模拟,但最终得到了错误:

"error": "access_denied",
"error_description": "Client not allowed to exchange"
Run Code Online (Sandbox Code Playgroud)

这是 Postman 设置,其中包含admin-cli、 clientId 和用户justin,我想获取其令牌,该令牌存在于“用户”部分中。

在此输入图像描述

我在 Postman 中使用的 admin-cli 密钥:

在此输入图像描述

我遵循了Keycloak Direct Naked Impersonation 文档中的所有步骤。

  1. 将“启用用户权限”切换为“开”。 在此输入图像描述

  2. 为此权限定义策略。 在此输入图像描述

  3. 将客户端策略(在我的例子中为“客户端模拟者”)添加到用户的模拟权限中 在此输入图像描述

  4. 这是 Keycloak 推荐的请求设置,可以让这种直接的裸体模拟发挥作用。您在我上面的邮递员设置中看到了这一点。

curl -X POST \
    -d "client_id=starting-client" \
    -d "client_secret=the client secret" \
    --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
    -d "requested_subject=wburke" \
    http://localhost:8080/realms/myrealm/protocol/openid-connect/token
Run Code Online (Sandbox Code Playgroud)

在 Docker 内部,我设置了 token_exchange=enabled 和 admin_fine_grained_authz=enabled

- name: "KEYCLOAK_EXTRA_ARGS"
  value: "-Dkeycloak.profile.feature.admin=enabled -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled -Dkeycloak.profile.feature.token_exchange=enabled"
Run Code Online (Sandbox Code Playgroud)

我日复一日地搜索有关这个主题的内容,并测试了目前互联网上有关该主题的所有可用选项,但没有成功。

如果这对您有用,请分享您的解决方法。或者至少请给出一些想法,也许我错过了一些东西。

为user-impersonate创建新策略,我在其中添加了用户 Justin

在此输入图像描述

然后在权限中我添加了这个策略

在此输入图像描述

dre*_*ash 9

问题是文档包含错误的图像,即:

在此输入图像描述

它应该是Client Policy与客户端admin-cli而不是用户一起admin

例如:

在此输入图像描述

因此,您需要 2 个策略/权限:

  1. impersonate决定管理员是否可以模拟其他用户的策略),您在其中创建Client Policy并传递客户端“admin-cli”(在您的情况下);
  2. user-impersonated决定哪些用户可以被模拟的策略。这些策略适用于被模拟的用户),您在其中创建User Policy并传递用户“justin”(在您的情况下)。

一步一步:KC 20.0.3 新 UI

(旁注,至少在生产环境中,您应该使用其他领域和客户端,而不是 master 和 admin-cli)

启用以下秘密admin-cli

  • 转到大师 > 客户 >admin-cli
  • 设置Client authenticationON

创建两个策略:1 个客户端策略和 1 个用户策略

  • 转到大师 > 客户 >master-realm
  • 单击选项Authorization
  • 单击子Policies选项卡

在此输入图像描述

  • 单击Create policy,然后Client
  • 为其命名(例如,客户端模仿者)
  • 添加admin-cli到该Client字段并单击Save

在此输入图像描述

再次重复上述步骤,但这次User Policy为将被模拟的用户创建一个(即,在您的情况下为 justin)

在此输入图像描述

将策略添加到相应的范围/权限:

  • Users
  • 转到选项卡Permissions
  • 设置Permissions enabledON
  • 点击impersonate
  • 选择客户端对应的策略admin-cli例如名为 的策略Client-impersonator
  • 点击Save

在此输入图像描述

  • 再去Users
  • 转到选项卡Permissions
  • 这次选择user-impersonated
  • 并为模拟用户(即justin)选择策略

在此输入图像描述

执行请求:

curl -X POST \
    -d "client_id=admin-cli" \
    -d "client_secret=8AEx99Ob4Hc8oricSGnii6x4Rs57g4ny" \
    --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
    -d "requested_subject=justin" \
    http://0.0.0.0:8080/realms/master/protocol/openid-connect/token
Run Code Online (Sandbox Code Playgroud)