Keycloak-gatekeeper:“aud”声明和“client_id”不匹配

Posted

技术标签:

【中文标题】Keycloak-gatekeeper:“aud”声明和“client_id”不匹配【英文标题】:Keycloak-gatekeeper: 'aud' claim and 'client_id' do not match 【发布时间】:2019-05-02 04:24:05 【问题描述】:

设置aud 声明以避免以下错误的正确方法是什么?

unable to verify the id token   "error": "oidc: JWT claims invalid: invalid claims, 'aud' claim and 'client_id' do not match, aud=account, client_id=webapp"

我通过硬编码aud 声称与我的client_id 相同来解决此错误消息。有没有更好的办法?

这是我的docker-compose.yml

version: '3'
services:
  keycloak-proxy:
    image: "keycloak/keycloak-gatekeeper"
    environment:
     - PROXY_LISTEN=0.0.0.0:3000
     - PROXY_DISCOVERY_URL=http://keycloak.example.com:8181/auth/realms/realmcom
     - PROXY_CLIENT_ID=webapp
     - PROXY_CLIENT_SECRET=0b57186c-e939-48ff-aa17-cfd3e361f65e
     - PROXY_UPSTREAM_URL=http://test-server:8000
    ports:
      - "8282:3000"
    command:
      - "--verbose"
      - "--enable-refresh-tokens=true"
      - "--enable-default-deny=true"
      - "--resources=uri=/*"
      - "--enable-session-cookies=true"
      - "--encryption-key=AgXa7xRcoClDEU0ZDSH4X0XhL5Qy2Z2j"
  test-server:
    image: "test-server"

【问题讨论】:

您找到解决方案了吗?我面临同样的问题,不知道如何解决这个问题 【参考方案1】:

在最近的 keycloak 版本 4.6.0 中,客户端 ID 显然不再自动添加到访问令牌的受众字段“aud”中。 因此,即使登录成功,客户端也会拒绝用户。 要解决此问题,您需要为您的客户配置受众(比较文档 [2])。

在 Keycloak 中配置受众

添加领域或配置现有领域 添加客户端 my-app 或使用现有的 转到新添加的“客户端范围”菜单 [1] 添加客户端范围“优质服务” 在“优质服务”的设置中转到映射器选项卡 创建协议映射器“my-app-audience” 名称:my-app-audience 选择映射器类型:受众 包含的客户受众:my-app 添加到访问令牌:开启 在“客户端”菜单中配置客户端 my-app 我的应用设置中的客户端范围选项卡 将可用的客户端范围“good-service”添加到分配的默认客户端范围

如果您有多个客户,请为其他客户重复上述步骤并添加优质服务范围。 这背后的目的是隔离客户端访问。颁发的访问令牌仅对目标受众有效。 这在 Keycloak 的文档 [1,2] 中有详细描述。

keycloak 文档最新主版本的链接:

[1]https://github.com/keycloak/keycloak-documentation/blob/master/server_admin/topics/clients/client-scopes.adoc [2]https://github.com/keycloak/keycloak-documentation/blob/master/server_admin/topics/clients/oidc/audience.adoc

带有 git 标签的链接:

[1]https://github.com/keycloak/keycloak-documentation/blob/f490e1fba7445542c2db0b4202647330ddcdae53/server_admin/topics/clients/oidc/audience.adoc [2]https://github.com/keycloak/keycloak-documentation/blob/5e340356e76a8ef917ef3bfc2e548915f527d093/server_admin/topics/clients/client-scopes.adoc

【讨论】:

我仍然收到同样的错误,看起来网守仍在检查 client_id,即使我已确认令牌具有良好服务的范围。 为我工作。实际上,步骤可以更简单。客户端范围是共享的映射器和角色。在这里,我们可以为我的客户添加一个映射器。 1. 编辑我的客户端 2. 打开mapper 选项卡 3. 创建协议映射器“my-app-audience”。该值与此回复相同。 非常感谢,该解决方案对我来说效果很好,正如我所描述的那样,挽救了我的一天。 :)【参考方案2】:

这是由于一个错误:https://issues.jboss.org/browse/KEYCLOAK-8954

错误报告中描述了twoworkarounds,它们看起来与accepted answer here基本相同,但可以应用于客户端范围role,所以你没有将它们分别应用于每个客户。

【讨论】:

【参考方案3】:

如果你像我一样想自动化 keycloak 配置,你可以使用 kcadm

/opt/jboss/keycloak/bin/kcadm.sh \ 创建客户端/d3170ee6-7778-413b-8f41-31479bdb2166/protocol-mappers/models -r your-realm \ -s 名称=受众映射\ -s 协议=openid 连接\ -s protocolMapper=oidc-audience-mapper\ -s config.\"included.client.audience\"="your-audience" \ -s 配置。\"access.token.claim\"="true" \ -s config.\"id.token.claim\"="false"

【讨论】:

以上是关于Keycloak-gatekeeper:“aud”声明和“client_id”不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何能够清除aud脚本?

Firebase Auth ID 令牌的“aud”声明不正确

JWT Token 中的 Aud 字段表示啥?

oracle的aud文件能删吗

新款文章,绝无仅有!微信语音aud文件转换为mp3格式

3. 清理统一审计 AUD$UNIFIED 基表部份数据