keycloak 无法在 access_token 中获取客户端角色

Posted

技术标签:

【中文标题】keycloak 无法在 access_token 中获取客户端角色【英文标题】:keycloak impossible to get client-roles inside access_token 【发布时间】:2021-03-30 13:40:34 【问题描述】:

我是 keycloak 的新手,按照互联网上的教程,我配置了一个新的领域“示例”,其中包含客户端“app-backend”、相关角色“admin”(未组合)和领域角色“app- admin”(由客户端角色“admin”组成)。

我还创建了一个用户,并分配了领域角色“管理员”。 此时一切正常,但是,当我通过对 keycloak 服务器(http://localhost:8080/auth/realms/barber-reservation/protocol/openid-connect/token)的 POST API 调用请求访问令牌时,我已经注意到客户端角色不包含在“resource_access”对象中,相反我在其中找到了“account”对象。

这种奇怪的行为使我的 Spring Boot 应用程序的所有授权验证都失败。

在收到访问令牌之后:


  "exp": 1608478284,
  "iat": 1608477984,
  "jti": "5ce17d4d-e3b3-4207-8010-45c0895a9a6a",
  "iss": "http://localhost:8080/auth/exmple/app-backend",
  "aud": [
    "app-backend"
  ],
  "sub": "d3fcc7df-878e-4363-91d6-f06437de5f90",
  "typ": "Bearer",
  "azp": "app-frontend",
  "session_state": "dad4ab85-850a-4c63-8a26-7b3b6de9f821",
  "acr": "1",
  "allowed-origins": [
    "*"
  ],
  "realm_access": 
    "roles": [
      "app-admin"
    ]
  ,
    "resource_access": 
    "account": 
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    ,
    "app-backend": 
      "roles": [
        "admin"
      ]
    
  ,
  "scope": "openid email profile",
  "email_verified": true,
  "name": "Name Surname",
  "preferred_username": "user@email.com",
  "locale": "it",
  "given_name": "Name",
  "family_name": "Surname",
  "email": "user@email.com"

我期待客户端角色部分包含在“resource_access”对象中,如下所示:

"resource_access": 
   "app-backend": 
      "roles": [
        "admin"
      ]
    

关于如何纠正这种奇怪行为的任何想法? 谢谢。

【问题讨论】:

【参考方案1】:

这里没有什么奇怪的,来自客户端“app-backend”的客户端角色 admin 位于 resource_access 对象上:

"resource_access": 
  
    "account": 
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    ,
    "app-backend": 
      "roles": [
        "admin"
      ]
    
  ,

resource_access 是键值列表,客户及其角色。

【讨论】:

以上是关于keycloak 无法在 access_token 中获取客户端角色的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 keycloak 保护 python flask rest api 服务

是否可以仅使用 Keycloak 进行身份验证?

使用 Keycloak 获取 id_token

无法在 keycloak 上查看登录页面

为啥 Angular 无法识别用户是不是使用 keycloak 登录?

无法在 keycloak 中创建用户。获取 403 状态