You need to enable JavaScript to run this app. Keycloak JWT令牌返回服务账户角色而非用户自定义分配角色问题
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak JWT令牌返回服务账户角色而非用户自定义分配角色问题

问题核心

你当前的流程错误混用了两种完全独立的OIDC授权模式,这是拿到服务账号令牌、角色和预期不符的根本原因。
你第一步跳转Keycloak登录页拿code,本来走的是授权码模式的用户登录流程,但第三步用code换token时,错误将grant_type设为了client_credentials。

client_credentials是客户端直接调接口拿服务凭证的模式,全程不关联登录页输入账号密码的普通用户,只会返回和客户端绑定的专用服务账号(也就是你解码令牌里preferred_username: service-account-efairy-backend的来源),因此令牌里的角色只会读取服务账号绑定的配置,和你给普通测试用户分配的自定义角色没有任何关联。

修正步骤

1. 替换token请求的授权类型

把第三步换token接口的grant_type参数从client_credentials改为authorization_code,同时补全授权码模式要求的必传参数,否则会直接校验失败:

  • 保留client_id、client_secret参数
  • 传入第一步跳转登录成功后拿到的临时授权码code(注意code是一次性的,有效期通常只有几十秒)
  • 传入和第一步跳转登录时完全一致的redirect_uri(值必须和http://localhost:8083/auth-redirect-url逐字符匹配,否则Keycloak会直接拒绝请求)

正确的token请求参数示例:

POST {Keycloak地址}/auth/realms/efairy-realm/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=efairy-backend
&client_secret=你的客户端密钥
&code=第一步回调拿到的临时code值
&redirect_uri=http://localhost:8083/auth-redirect-url

2. 校验角色相关配置

改完授权类型后如果令牌里依然没有用户对应的自定义角色,逐项检查以下配置:

  • 确认自定义角色的归属:如果是创建在efairy-backend客户端下的客户端专属角色,分配给用户后会出现在令牌的resource_access.efairy-backend.roles字段下;如果是Realm全局角色,会出现在realm_access.roles字段下,不要混淆两类角色的返回位置
  • 确认客户端的Scope配置:进入efairy-backend客户端的Client Scopes配置页,检查是否开启了角色的映射范围,避免令牌生成时过滤掉已分配给用户的角色
  • 如果当前业务没有服务间调用的需求,可以把客户端的Service Accounts Enabled开关关闭,从配置层面避免误触发服务账号令牌的生成

3. 结果校验

修正后拿到的普通用户令牌,preferred_username字段会显示你登录的真实用户名(比如你测试的moderator账号),而不是service-account-efairy-backend;对应的resource_access.efairy-backend.roles字段会自动加载你在用户Role Mappings页给该账号分配的所有自定义角色,和你预期的返回值完全一致。

内容的提问来源于stack exchange,提问作者Mateusz Stanczak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 01:45:00