Keycloak 26轻量访问令牌交换失败问题及跨域身份模拟需求
解决Keycloak 26轻量访问令牌交换失败问题
问题原因
轻量访问令牌属于引用令牌(Reference Token),并非自包含的JWT格式。跨域进行令牌交换时,目标域无法直接验证令牌有效性,必须调用令牌发行域(master)的introspect端点完成验证。报错Key not found本质是目标域无法完成这一验证流程,核心原因是相关配置缺失。
解决步骤
1. 配置master域的admin-cli客户端
- 进入master域的
Clients->admin-cli->Settings:- 开启Service Accounts Enabled
- 切换到
Service Account Roles标签:- 选择
realm-management客户端,添加view-users、introspect-tokens权限(确保服务账号具备令牌 introspect 和用户信息读取权限)
- 选择
2. 配置目标域(abc)的信任与客户端设置
- 进入abc域的
Clients->admin-cli->Settings:- 开启Allow Impersonation(满足身份模拟的核心需求)
- 将Access Type设置为
confidential(令牌交换需要客户端认证,public类型无法满足)
- 切换到
Advanced标签:- 在Token Exchange Policy中添加master域为信任发行域:点击
Add,输入master域的ID或名称,配置允许令牌交换的规则
- 在Token Exchange Policy中添加master域为信任发行域:点击
3. 修改令牌交换请求
轻量令牌作为引用令牌,需明确指定subject_token_type参数;若客户端为confidential类型,还要加入client_secret完成认证。如果需要身份模拟,额外添加requested_subject参数指定目标域的用户账号:
# 获取master域的轻量访问令牌 access_token_1=$(curl -Ss -X 'POST' "http://localhost:8000/auth/realms/master/protocol/openid-connect/token" -d "client_id=admin-cli&grant_type=password&username=admin&password=qwerty12345&scope=openid" | jq -r .access_token) # 交换为abc域的目标用户令牌 access_token_2=$(curl -Ss -X 'POST' "http://localhost:8000/auth/realms/abc/protocol/openid-connect/token" \ -d "client_id=admin-cli" \ -d "client_secret=YOUR_ABC_ADMIN_CLI_SECRET" \ # 替换为abc域admin-cli的客户端密钥 -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ -d "subject_token=$access_token_1" \ -d "subject_token_type=urn:ietf:params:oauth:token-type:access_token" \ -d "audience=admin-cli" \ -d "requested_subject=TARGET_USERNAME") # 替换为abc域的目标用户账号
4. 验证跨域基础条件
- 确保abc域的Keycloak节点能够正常访问master域的
/auth/realms/master/protocol/openid-connect/token/introspect端点 - 检查master域的
Realm Settings->Tokens:确认Token Introspection Enabled处于开启状态
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

