Keycloak公共客户端能否使用同一授权跨资源服务器校验资源访问权限
问题结论
你描述的场景完全可以实现,Client does not support permissions报错是客户端配置不全导致的,按以下步骤调整即可。
配置步骤
配置所有资源服务器客户端
进入Keycloak后台,打开你用到的所有资源服务器客户端(比如你请求里的resource-server-1)的设置页,切换到「授权」标签,将「授权已启用」开关打开并保存,Keycloak只有开启该配置后才允许客户端参与UMA权限校验。如果需要严格拦截无权限请求,确认同页面的「策略执行者模式」设置为ENFORCING(默认值)。配置Public客户端权限
- 打开你用来获取初始access token的
public-client设置页,在「能力设置」中确认「直接访问授权已启用」开关为打开状态,否则密码授权模式会被拦截。 - 在同页面的「客户端作用域」配置中,给该客户端添加
uma_authorization作用域,确保客户端有资格发起UMA ticket申请请求。 - 修改你获取初始token的代码,请求参数的scope字段新增
uma_authorization,修改后代码如下:
export access_token=`curl --silent -u public-client:1 \ -k -d "grant_type=password&username=${USER_NAME}&password=${USER_PASSWORD}&scope=email profile uma_authorization" \ -H "Content-Type:application/x-www-form-urlencoded" \ ${KEYCLOAK_TOKEN_URL} | jq '.access_token' -r`- 可解码拿到的access token,确认payload中存在
uma_authorization字段且值为true,代表配置生效。
- 打开你用来获取初始access token的
配置资源与权限策略
进入每个资源服务器客户端的「授权」-「资源」页面,提前创建好所有受保护的资源条目,再切换到「权限」「策略」页面,将资源的访问权限和对应用户/角色/用户组绑定,否则即使拿到UMA ticket,访问资源时也会被判定为无权限。跨资源服务器权限申请配置
如果你需要用同一个RPT(即UMA ticket返回的权限令牌)访问多个资源服务器,发起UMA ticket请求时传入多个audience参数即可,示例代码如下:curl --silent -X POST \ ${KEYCLOAK_TOKEN_URL} \ -H "Authorization: Bearer ${access_token}" \ --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \ --data "audience=resource-server-1" \ --data "audience=resource-server-2"按上述配置完成后,返回的RPT会包含所有指定资源服务器的访问权限,无需重复申请。
内容的提问来源于stack exchange,提问作者Imants Gulbis
相关产品推荐
相关产品推荐

