Keycloak:模拟为错误的客户铸造令牌

问题描述 投票:0回答:1

我正在尝试通过使用信任客户端并为公共客户端发布令牌来通过模拟来发布访问令牌。我已经设置了令牌交换权限并且请求有效。但是,我的问题是发出的令牌似乎在 AZP 中包含错误的客户端。

以下是我的要求:

curl -v -X POST \
    -d "client_id=impersonator-client" \
    -d "client_secret=<secret omitted>" \
    --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
    -d "audience=target-client" \
    --data-urlencode "requested_subject=john.doe" \
    http://localhost:8080/auth/realms/swarm/protocol/openid-connect/token

基本上我想通过使用“impersonator-client”模拟用户来获得用户“john.doe”的访问令牌。发行的代币应该是为“target-client”铸造的,然而,AZP 仍然包含“impersonator-client”。

我这样做的原因是因为它应该可以使用外部身份验证工作流程登录,最终提供一个访问令牌,然后可以在我的后端服务器上进行验证,该服务器使用受信任的客户端进行模拟。

根据文档(https://www.keycloak.org/docs/latest/securing_apps/#_token-exchange),观众应该定义应该为其铸造令牌的目标客户。

关于权限:

我已经使用引用“impersonator-client”的客户端策略设置了“admin-impersonating.permission.users”权限。 “target-client”本身配置了权限“token-exchange.permission.client.e236d39c-9b9c-4815-b734-90364fea4e91”,其中包括引用“impersonator-client”的客户端策略。我在那里遗漏了什么吗?这里的问题是文档似乎是错误的。文档使用“user-impersonated.permission.users”而不是“admin-impersonating.permission.users”。当我那样尝试时,请求甚至被拒绝了。

这是 Keycloak 中的错误还是我做错了什么?

提前致谢!

jwt keycloak access-token impersonation
1个回答
1
投票

更新 我最初在版本 15 左右编写了我的解决方案,下面的工作正常。我们已经升级到版本 20,下面的解决方案不再有效.

似乎有用的东西:

  • 您可以进行模拟,您授权目标客户的服务帐户模拟用户。虽然这确实有效,但它会产生安全隐患,特别是如果您的客户是公开的。
  • 您可以在同一个应用程序中为用户进行令牌交换(例如,您想将具有一组范围的令牌交换为具有不同一组范围的令牌,基本上是在应用程序中为用户降低或升级范围)

不起作用的东西:

  • 交换令牌作为源客户端并指定目标客户端作为
    audience
    。虽然您可以获得它来颁发令牌,但 Keycloak 保留了源客户端的
    azp
    。如果您尝试获取刷新令牌,则您的目标客户端无法刷新该令牌。另外,如果您有任何资源服务器期望
    azp
    中的目标客户端,他们会失望的。
  • 你不能再交换它,所以你看起来像目标客户端,试图使用源客户端的令牌进行交换(下面的解决方案)。

目前,我认为这个问题没有很好的解决方案。您可以在此处找到更多详细信息。我的组织采用的工作是不符合 OIDC/OAuth2 的 REST API,如果源客户端提供了良好的令牌,然后将用户模拟为目标客户端,代表目标客户端进行刷新等,就可以进行模拟。我们正在调查 SPI 以制定我们自己的战略,但我们还没有对此产生牵引力。他们是休息时间。毕竟这是一个预览功能。


好的,我遇到了这个问题,最大的问题之一是它阻止了我的应用程序(

target-client
)执行刷新令牌工作流程。如果我使用预期的目标客户端执行 refresh_token 授予,我会收到一条错误消息,说
Session doesn't have the required grant.
我发现这个
issue
,这导致我
this

,它在请求令牌交换时指定

azpInvalid refresh token. Token client and authorized client don't match是导致访问和刷新令牌错误client_id

并搞砸一切的原因.我不知道这是故意的还是文档有误,或者这是一个错误,我将来会遇到问题。以后我会看那些错误报告以获取更多详细信息。
所以这是进行令牌交换的工作方式(我使用的是 Keycloak 15.0.2),然后从中刷新。这是 Kotlin,但你明白了。这假设您已经执行了必要的配置
here
.

starting-client

© www.soinside.com 2019 - 2024. All rights reserved.