基于Keycloak代理与Apache APISIX的身份认证流程可行性问询
问题解答:Keycloak身份代理+APISIX网关架构流程验证
一、整体流程可行性判断
这个架构方向是可行的:用Keycloak_1作为上游IdP对接LDAP,Keycloak_2作为身份代理聚合多租户IdP,再通过APISIX做网关鉴权,完全符合OIDC身份代理的典型场景。但当前的具体流程和配置存在关键错误,需要调整补充。
二、当前配置/流程的核心错误
Token交换方式不符合OIDC规范
你试图用Keycloak_1签发的TOKEN_KEYCLOAK_1直接请求Keycloak_2的token端点换取TOKEN_KEYCLOAK_2,这是错误的。Keycloak的身份代理模式不支持这种直接的token置换,必须通过标准OIDC授权流程完成身份验证和token签发。联邦用户未正确关联
即使Keycloak_2能识别Keycloak_1的用户,若未在Keycloak_2本地创建联邦用户记录(仅关联上游身份,不复制密码),Keycloak_2无法生成包含用户属性、权限的合法token,后续APISIX的鉴权也会失败。
三、必须补充/调整的关键步骤
1. 完善Keycloak_2的身份代理配置,自动创建联邦用户
进入Keycloak_2的目标Realm,找到已配置的Keycloak_1外部IdP,调整以下设置:
- 开启First Broker Login:勾选
Create User If Unique,确保用户首次通过Keycloak_1登录时,Keycloak_2自动创建对应的联邦用户 - 添加User Federation Mapper:配置将Keycloak_1中的用户属性(如username、email、角色)同步到Keycloak_2的联邦用户中,保证签发的token包含完整用户信息
2. 改用标准OIDC授权码流获取Keycloak_2的Token
放弃直接用TOKEN_KEYCLOAK_1置换的方式,采用合规的授权码流程:
步骤1:获取授权码(用户登录环节)
curl --location 'http://KEYCLOAK_2:9000/realms/REALM_2/protocol/openid-connect/auth' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=TEST_CLIENT_2' \ --data-urlencode 'redirect_uri=http://your-callback-url' \ --data-urlencode 'response_type=code' \ --data-urlencode 'scope=openid profile email' \ --data-urlencode 'state=random-state-string'
该请求会自动跳转到Keycloak_1的登录页,用户验证通过后,Keycloak_1会回调指定地址并返回授权码。
步骤2:用授权码换取Keycloak_2的Token
curl --location 'http://KEYCLOAK_2:9000/realms/REALM_2/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=TEST_CLIENT_2' \ --data-urlencode 'client_secret=CLIENT_2_SECRET' \ --data-urlencode 'grant_type=authorization_code' \ --data-urlencode 'code=AUTHORIZATION_CODE_FROM_STEP1' \ --data-urlencode 'redirect_uri=http://your-callback-url'
此请求返回的access_token即为合法的TOKEN_KEYCLOAK_2,可用于APISIX的鉴权请求。
3. 验证APISIX authz-keycloak插件配置
确保插件指向Keycloak_2的合法端点:
- 配置
discovery为Keycloak_2的OIDC元数据地址:http://KEYCLOAK_2:9000/realms/REALM_2/.well-known/openid-configuration - 填写Keycloak_2中创建的客户端
client_id和client_secret - 开启token introspection校验,确保APISIX能验证token的有效性和权限
四、额外注意事项
- 若为纯后端服务调用(无前端跳转),可考虑使用Client Credentials Flow,但仍需通过Keycloak_2的端点获取token,禁止直接使用Keycloak_1的token
- 确保Keycloak_1和Keycloak_2的信任关系配置正确:Keycloak_2的外部IdP需正确填写Keycloak_1的OIDC元数据地址,并启用token签名验证
内容的提问来源于stack exchange,提问作者Rikissssss
相关产品推荐
相关产品推荐

