You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无client_secret时从Keycloak userinfo端点获取用户角色

Keycloak公共客户端从userinfo端点获取用户角色的解决方案

一、配置角色映射器(核心步骤)

因为你的客户端是公共类型(无需client_secret),要让角色出现在userinfo返回结果里,得正确配置映射器:

  • 登录Keycloak控制台,进入目标Realm,选中你的公共客户端
  • 切换到「Client scopes」标签,找到客户端关联的默认scope(比如roles,也可以新建自定义scope)
  • 点击该scope的「Mappers」标签,添加新映射器:
    • 类型选「User Realm Role」
    • 关键参数配置:
      • 名称:随便填,比如realm_roles_mapper
      • Token Claim Name:设置成你想要的字段名(比如realm_roles,别用默认的容易冲突的名称)
      • Claim JSON Type:选JSON(让角色以数组形式返回)
      • Add to userinfo:必须勾选
      • Multivalued:勾选
      • Role prefix:留空(去掉你当前返回结果里的Realm Role prefix前缀)
      • Add to ID token:勾选(userinfo会复用ID Token的声明)

二、检查客户端基础设置

  • 回到客户端的「Settings」标签:
    • 确认Access Type是public
    • Valid Redirect URIs配置正确(授权码流必填,否则无法获取授权码)

三、重新调用userinfo端点

  • 走标准授权码流流程,获取Access Token
  • 调用userinfo时,把Access Token放在Bearer头里:
    GET /realms/{你的Realm名}/protocol/openid-connect/userinfo
    Authorization: Bearer {你的Access Token}
    
    正常返回结果会包含配置好的角色字段,示例:
    {
       "sub":"ace69576-614e-41fe-9584-aac69c34dec1",
       "email_verified":true,
       "name":"John Doe",
       "realm_roles":[
          "uma_authorization",
          "offline_access"
       ],
       "preferred_username":"user",
       "given_name":"John",
       "family_name":"Doe",
       "email":"johndoe@example.com"
    }
    

排查你当前的问题

你现在返回的Token Claim Name字段是因为映射器配置错误——你把「Token Claim Name」这个参数的标识当成了字段名,只要在映射器里把这个参数改成自定义的字段名(比如realm_roles)就能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:17:08