如何不使用适配器实现Keycloak JWT Token的校验与角色读取
可用官方库推荐
Keycloak官方提供了无适配器耦合的keycloak-core核心工具库,可以满足你纯手动解析校验JWT、获取结构化令牌对象的需求,不会引入任何自动配置或适配器相关逻辑。
依赖引入
你可以直接引入对应版本的核心包,以下是常用构建工具的坐标配置:
- Maven配置
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-core</artifactId> <version>和你服务端匹配的Keycloak版本</version> </dependency>
- Gradle配置
implementation 'org.keycloak:keycloak-core:和你服务端匹配的Keycloak版本'
使用步骤
1. 准备Keycloak公钥
你可以从Keycloak管理后台对应领域的「密钥」tab下直接复制公钥字符串,也可以运行时请求Keycloak的领域公开接口获取公钥信息,再转换为对应编程语言的公钥对象。
2. 令牌校验与解析
直接使用官方封装的TokenVerifier工具类即可同时完成签名校验、字段合法性校验和结构化解析,以下为Java示例:
import org.keycloak.TokenVerifier; import org.keycloak.representations.AccessToken; import org.keycloak.common.util.KeyUtils; import java.security.PublicKey; // 公钥转换 String keycloakPublicKeyStr = "你获取到的Keycloak公钥字符串"; PublicKey publicKey = KeyUtils.getPublicKeyFromString(keycloakPublicKeyStr); // 构造校验器,支持按需开启校验规则 TokenVerifier<AccessToken> verifier = TokenVerifier.create(待校验的JWT字符串, AccessToken.class) .publicKey(publicKey) .withDefaultChecks(); // 默认开启签名校验、过期校验、nbf校验 // 校验成功后直接得到结构化的AccessToken对象 AccessToken accessToken = verifier.verify().getToken();
3. 读取角色信息
AccessToken已经封装了角色读取的现成方法,无需手动解析claims字段:
// 获取领域级角色集合 Set<String> realmRoles = accessToken.getRealmAccess().getRoles(); // 获取指定客户端的客户端级角色集合 Set<String> clientRoles = accessToken.getResourceAccess("你的客户端ID").getRoles();
额外说明
- 你可以根据业务需求调整校验规则,比如需要校验受众、签发方时,可额外调用对应方法配置校验项。
keycloak-core没有额外的框架依赖,完全可以独立使用,适配任何架构的应用。- 建议依赖版本和你正在使用的Keycloak服务端版本保持一致,避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

