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

时间:2018-11-30 02:20:55

标签: keycloak keycloak-gatekeeper

设置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"

3 个答案:

答案 0 :(得分:24)

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

在Keycloak中配置受众

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

如果您有多个客户端,请对其他客户端也重复上述步骤,并添加良好服务范围。 其背后的目的是隔离客户端访问。颁发的访问令牌仅对目标受众有效。 Keycloak的文档[1,2]中对此进行了详细说明。

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

具有git标签的链接:

答案 1 :(得分:4)

如果像我一样,要自动执行密钥斗篷配置,则可以使用kcadm

/opt/jboss/keycloak/bin/kcadm.sh \
        create clients/d3170ee6-7778-413b-8f41-31479bdb2166/protocol-mappers/models -r your-realm \
        -s name=audience-mapping \
        -s protocol=openid-connect \
        -s protocolMapper=oidc-audience-mapper \
        -s config.\"included.client.audience\"="your-audience" \
        -s config.\"access.token.claim\"="true" \
        -s config.\"id.token.claim\"="false"

答案 2 :(得分:3)

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

错误报告中描述了two workarounds,它们似乎都与accepted answer here做着相同的事情,但是可以应用于客户范围{{1} },因此您不必将它们分别应用于每个客户。