如何在Spring Authorization Server生成的JWT中设置jti声明?及两类生成器差异
一、如何在JWT令牌中添加jti声明
你可以通过自定义JwtCustomizer来实现,无需重写JwtGenerator的完整方法,具体步骤如下:
- 创建自定义
JwtCustomizerBean,用UUID生成唯一的jti标识并添加到JWT声明中:
@Bean public JwtCustomizer jwtCustomizer() { return (jwtBuilder, context) -> { String jti = UUID.randomUUID().toString(); jwtBuilder.id(jti); }; }
- 在授权服务器配置中,将这个自定义组件关联到JWT生成逻辑:
@Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); authorizationServerConfigurer .token(token -> token .jwt(jwt -> jwt .customizer(jwtCustomizer()))); // 补充其他必要配置 return http.apply(authorizationServerConfigurer).and().build(); }
配置完成后,生成的JWT令牌就会包含jti声明。
二、JwtGenerator与OAuth2AccessTokenGenerator的区别
职责范围不同:
JwtGenerator是专门生成JWT格式令牌的组件,只处理JWT的构建、签名、声明填充等专属逻辑。OAuth2AccessTokenGenerator是通用令牌生成器,支持生成多种类型的访问令牌:既可以生成默认的不透明(Opaque)令牌,也能结合JwtGenerator生成JWT令牌,属于上层抽象组件。
使用场景不同:
- 当明确需要生成JWT令牌时,会直接或间接调用
JwtGenerator,比如配置中指定jwt()方式生成令牌时,底层依赖它构建JWT。 OAuth2AccessTokenGenerator是默认的令牌生成器,若未配置JWT相关自定义逻辑,它会生成不透明令牌(令牌本身是随机字符串,实际信息存储在授权服务器端)。
- 当明确需要生成JWT令牌时,会直接或间接调用
内部逻辑差异:
JwtGenerator会处理JWT特有的元素,比如签名算法、密钥、标准声明(iss、exp、sub等)以及自定义声明的添加。OAuth2AccessTokenGenerator负责设置令牌的基础属性(过期时间、权限范围等),再根据配置决定生成不透明令牌,还是调用JwtGenerator生成JWT。
内容的提问来源于stack exchange,提问作者Aakanksha
相关产品推荐
相关产品推荐

