Keycloak登录后如何从KEYCLOAK_IDENTITY cookie获取Bearer Token并校验角色
问题解答
首先明确:KEYCLOAK_IDENTITY 是Keycloak的会话状态Cookie,仅存储认证会话的元数据,本身不包含你需要的Bearer Token(Access Token),无法直接从该Cookie中提取可用的API调用凭证。
一、获取Bearer Token的正确方案
你当前用的是OAuth2授权码流程,可通过以下两种方式获取Bearer Token:
- 方案1:使用官方
keycloak-js适配器(React项目推荐)
这是最省事的方案,不需要自己处理授权码、Token刷新等逻辑,示例代码如下:import Keycloak from 'keycloak-js'; // 配置和你的Keycloak客户端参数保持一致 const keycloakInstance = new Keycloak({ url: "https://10.10.10.10:8445/auth", realm: "abcrealm", clientId: "abc-client" }); // 初始化时自动触发登录校验 keycloakInstance.init({ onLoad: 'login-required' }).then(isAuthenticated => { if (isAuthenticated) { // 拿到的token字段就是你需要的Bearer Token const bearerToken = keycloakInstance.token; // 调用后端API时,请求头添加`Authorization: Bearer ${bearerToken}`即可 } }) - 方案2:手动用授权码兑换Token
如果你不想引入官方适配器,可以自己完成授权码兑换流程:- Keycloak登录完成跳转回你的前端页面时,从URL参数中提取
code值 - 向Keycloak Token端点
https://10.10.10.10:8445/auth/realms/abcrealm/protocol/openid-connect/token发送POST请求,请求参数为:grant_type=authorization_code
client_id=abc-client
code=你提取到的授权码
redirect_uri=https://10.10.10.10:3001/ - 接口成功返回后,响应中的
access_token字段就是你需要的Bearer Token。
- Keycloak登录完成跳转回你的前端页面时,从URL参数中提取
二、校验用户合法角色的方案
角色校验分为前端页面权限控制、后端接口权限校验两个环节,后端校验必须做,避免前端篡改导致权限越权:
- 前端校验(仅做页面交互控制)
用keycloak-js适配器可以直接调用内置方法快速校验角色:
你也可以自行解析Access Token/ID Token的Payload部分,从// 校验是否拥有全局Realm角色 const hasRealmRole = keycloakInstance.hasRealmRole('需要的角色名'); // 校验是否拥有当前客户端专属角色 const hasClientRole = keycloakInstance.hasResourceRole('需要的角色名', 'abc-client'); // 校验通过后再展示对应权限的操作按钮/页面realm_access.roles字段取全局角色列表,从resource_access.abc-client.roles字段取当前客户端角色列表自行判断。 - 后端校验(强制要求)
后端收到请求携带的Bearer Token后,先校验Token的签名合法性、有效期、签发方、受众是否符合要求,校验通过后解析Payload,和前端一样从realm_access、resource_access字段提取角色,判断当前请求的接口是否匹配用户权限。 - 如果你需要获取完整用户Profile
可以携带Bearer Token调用Keycloak用户信息端点https://10.10.10.10:8445/auth/realms/abcrealm/protocol/openid-connect/userinfo,返回结果包含完整的用户基础信息、角色列表。
内容的提问来源于stack exchange,提问作者vaibhav singhal
相关产品推荐
相关产品推荐

