Keycloak集成Grafana后无法登录,返回invalid_grant授权码错误如何解决?
异常根因
你遇到的报错由两层问题叠加导致:
- 底层错误是Keycloak生成OAuth令牌时无法解析角色字段,抛出
cannot map type for token claim异常,导致Grafana第一次用授权码换令牌的请求未正常返回结果 - Grafana触发自动重试,用同一个已经失效的授权码再次向Keycloak请求令牌,Keycloak识别到授权码已被使用,直接返回
invalid_grant: Code not valid错误
遗漏的配置项
核心是Keycloak侧未完成Grafana客户端的角色映射配置,和你Grafana.ini里的role_attribute_path规则不匹配:
- Keycloak的grafana客户端未开启角色字段返回开关,导致ID令牌、访问令牌、用户信息接口中没有
resource_access.grafana.roles字段,令牌生成时字段解析失败 - 未将创建好的Grafana客户端角色(Admin/Editor/Viewer)分配给对应用户,角色字段为空也会触发映射异常
修复步骤
1. 调整Keycloak客户端配置
- 进入对应
mcsrealm,找到grafana客户端,切换到「客户端作用域」标签 - 将
roles作用域添加到已分配作用域列表,进入roles作用域配置页,开启添加到ID令牌、添加到访问令牌、添加到用户信息三个开关 - 切换到grafana客户端的「角色」标签,创建Admin、Editor、Viewer三个客户端角色,再进入对应用户的「角色映射」页,分配对应的Grafana客户端角色
2. 可选优化Grafana配置
如果使用的是低于8.0版本的Grafana,可将role_attribute_path调整为如下写法,避免数组通配符解析异常:
role_attribute_path = contains(resource_access.grafana.roles, 'Admin') && 'Admin' || contains(resource_access.grafana.roles, 'Editor') && 'Editor' || 'Viewer'
3. 验证修复
清除浏览器缓存、删除Keycloak中已存在的用户会话,重启Grafana后重新发起登录即可。
内容的提问来源于stack exchange,提问作者Kambei
相关产品推荐
相关产品推荐

