Keycloak如何获取携带指定客户端角色的access token
Keycloak按需返回指定客户端角色的实现方案
Keycloak原生不支持scope=作用域名:参数这种带后缀的动态作用域语法,不用在控制台找对应配置项,要实现「仅保留1个通用角色作用域、传参灵活指定返回哪些客户端的角色」的需求,有两个可直接落地的方案,不用手动给每个后端客户端重复建作用域:
自定义协议映射器(完全匹配你的预期用法)
仅保留roles_all这一个可选客户端作用域,给这个作用域绑定自定义开发的角色映射器即可,逻辑非常简单:- 拦截OIDC授权、令牌签发请求,解析scope参数值,把格式为
roles_all:xxx的项拆出作用域名和目标客户端ID - 重写原生角色映射器的角色过滤逻辑,只把解析到的目标客户端下、当前用户实际持有的角色写入access token的claims,自动过滤其他无关客户端的角色
实现时直接继承Keycloak内置的UserClientRoleMapping类重写角色过滤方法即可,编译成jar包扔到Keycloak的providers目录重启就生效。配置完成后完全支持你预期的请求格式:
auth.server.com/realms/SomeRealm/protocol/openid-connect/auth?response_type=code&client_id=frontend&scope=openid roles_all:backend1 roles_all:backend2注意:请求必须携带默认的
openidscope,否则会触发OIDC协议校验报错。- 拦截OIDC授权、令牌签发请求,解析scope参数值,把格式为
管理API自动化创建作用域(零自定义开发可选)
如果不想写Keycloak扩展插件,可以写个简单的自动化脚本,每次新增后端机密客户端时,自动调用Keycloak管理端API完成专属client scope创建、角色映射器配置、关联到frontend客户端可选作用域列表的全流程操作。本质还是每个后端对应独立scope,但全程不需要手动在控制台点配置,也能把重复工作量降到最低。
踩坑提示:不要直接用Keycloak默认的客户端角色映射器,这个映射器只要被scope触发,就会把当前用户持有的所有客户端角色全量塞进token,没有动态过滤能力,必须调整映射逻辑才能实现按需返回的效果。
内容的提问来源于stack exchange,提问作者nubi
相关产品推荐
相关产品推荐

