从 keycloak jwt 令牌获取 ID(不是 clientId)

Posted

技术标签:

【中文标题】从 keycloak jwt 令牌获取 ID(不是 clientId)【英文标题】:get Id ( not clientId) from keycloak jwt token 【发布时间】:2021-10-08 10:39:36 【问题描述】:

JWT 只给出了用户信息和 clientId,我怎样才能得到客户端的 ID,如图所示

我可以从这个 URL 获取客户详细信息,特别是 ID https://$SERVER_URL/auth/admin/realms/master/clients?clientId=test

API 响应

  
    "id": "12af651d-f6fe-49ef-8e6f-b951a49ff7db", // want to add this id into JWT
    "clientId": "test",
    "rootUrl": "$authBaseUrl", ......

但我想保存我的 api 调用以获取 Id

如何在 jwt 中获取客户信息“Id”? 现在这显示在 jwt 的提取上


  exp: 1627981808,
  iat: 1627974608,
  sub: '923666de-0b37-42f0-b694-0491028d0b78', // user Id
  typ: 'Bearer',
  azp: 'test', // client id 
  acr: '1',
  scope: 'openid email profile',
  email_verified: false,
  name: 'name123',
  preferred_username: 'name123',
  given_name: 'name123',
  email: 'any_name@gmail.com'

任何帮助/信息都会对我有所帮助。

【问题讨论】:

keycloak.org/docs-api/15.0/rest-api/index.html - 您可以使用管理员 REST API 创建客户端/映射器 【参考方案1】:

您应该创建一个 SPI 并将其部署到您的 keycloak 实例。这是一个覆盖标准行为的 JAR。文档和 GitHub keycloak repo 中都描述了各种 SPI。 使用该 SPI,您几乎可以将任何内容添加到您的令牌中。我建议不要更改默认令牌中存在的任何内容,因为这可能会影响您的 OID 兼容性。

查看更多详情 here 和 here。

【讨论】:

为什么不能使用标准映射器?理论上,可以通过映射器添加具有静态客户端 uuid 的声明。这将只是客户端配置更改,因此不需要自定义 SPI 开发/部署。 @JanGaraj 您的解决方案可能对我有用,请您详细说明我该如何实现,谢谢 @TanzeelSaleem keycloak.org/docs/latest/server_admin/#_protocol-mappers - 创建已用客户端 Mapper Type: Hardcoded claim 的新映射器并根据您的需要配置其余选项 - 这是非常幼稚/简单的解决方案。 Javali 的方案也是有效的,但是很高级。 @JanGaraj 很好用。但我需要手动添加这个映射器。这可以通过任何来源自动化吗?当客户端创建其硬编码声明时还添加映射器?他们有这方面的 API 吗?

以上是关于从 keycloak jwt 令牌获取 ID(不是 clientId)的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak - 通过OIDC端点检索JWT令牌

使用带有spring security的keycloak JWT令牌时如何修复403

如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT 令牌

从 Keycloak 访问令牌中获取客户端会话 ID

如何从 Keycloak JWT 访问令牌中删除属性?

从 JWT 令牌中删除角色信息