Keycloak-gatekeeper:'aud' 声明与 'client_id' 不匹配
Keycloak-gatekeeper: 'aud' claim and 'client_id' do not match
设置 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"
在最近的 keycloak 版本 4.6.0 中,客户端 ID 显然不再自动添加到访问令牌的受众字段 'aud'。
因此,即使登录成功,客户端也会拒绝该用户。
要解决此问题,您需要为您的客户配置受众(比较文档 [2])。
在 Keycloak 中配置观众
- 添加领域或配置现有领域
- 添加客户端 my-app 或使用现有的
- 转到新添加的 "Client Scopes" 菜单 [1]
- 添加客户端范围'good-service'
- 在 'good-service' 转到映射器选项卡的设置中
- 创建协议映射器'my-app-audience'
- 名称:我的应用受众
- 选择映射器类型:受众
- 包括的客户受众:我的应用程序
- 添加到访问令牌:on
- 在 "Clients" 菜单中配置客户端 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 标签的链接:
这是由于一个错误:https://issues.jboss.org/browse/KEYCLOAK-8954
有 two workarounds described in the bug report, both of which appear to do basically the same thing as the 但可以应用于客户端范围 role
,因此您不必将它们单独应用于每个客户端。
如果你像我一样想要自动化 keycloak 配置,你可以使用 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"
设置 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"
在最近的 keycloak 版本 4.6.0 中,客户端 ID 显然不再自动添加到访问令牌的受众字段 'aud'。 因此,即使登录成功,客户端也会拒绝该用户。 要解决此问题,您需要为您的客户配置受众(比较文档 [2])。
在 Keycloak 中配置观众
- 添加领域或配置现有领域
- 添加客户端 my-app 或使用现有的
- 转到新添加的 "Client Scopes" 菜单 [1]
- 添加客户端范围'good-service'
- 在 'good-service' 转到映射器选项卡的设置中
- 创建协议映射器'my-app-audience'
- 名称:我的应用受众
- 选择映射器类型:受众
- 包括的客户受众:我的应用程序
- 添加到访问令牌:on
- 创建协议映射器'my-app-audience'
- 在 "Clients" 菜单中配置客户端 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 标签的链接:
这是由于一个错误:https://issues.jboss.org/browse/KEYCLOAK-8954
有 two workarounds described in the bug report, both of which appear to do basically the same thing as the role
,因此您不必将它们单独应用于每个客户端。
如果你像我一样想要自动化 keycloak 配置,你可以使用 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"