java - JWT 访问令牌不会在每个令牌授权调用上生成
问题描述
我已经使用 JWT 配置了我的 Oauth2 授权项目。当我使用客户端凭据进行授权时,我会获得如下所示的访问令牌。到期时间为43199
{
"access_token":"eyJhbGci........................",
"token_type": "bearer",
"expires_in": 43199,
"scope": "resource-access",
"jti": "45507f3e-2d8c-4dc8-95ce-295bb690cf3a"
}
我没有将令牌存储在数据库或会话等任何地方,但如果我调用相同的授权令牌端点,我将获得相同的访问令牌,并减少到期时间。
不确定此令牌的存储位置,我希望每次调用令牌授权端点时都会获得一个新令牌。
谁能帮我解决这个问题
下面给出了我的自定义AuthorizationServerConfigurerAdapter类
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Value("${scopes}")
private Boolean checkUserScopes;
@Autowired
private DataSource dataSource;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Bean
public OAuth2RequestFactory requestFactory() {
CustomOauth2RequestFactory requestFactory = new CustomOauth2RequestFactory(clientDetailsService);
requestFactory.setCheckUserScopes(true);
return requestFactory;
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.jdbc(dataSource).passwordEncoder(passwordEncoder);
}
@Bean
public TokenEndpointAuthenticationFilter tokenEndpointAuthenticationFilter() {
return new TokenEndpointAuthenticationFilter(authenticationManager, requestFactory());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenEnhancer(jwtAccessTokenConverter())
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
if (checkUserScopes) {
endpoints.requestFactory(requestFactory());
}
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
CustomJwtTokenEnhancerConfig tokenEnhancer = new CustomJwtTokenEnhancerConfig();
tokenEnhancer.setKeyPair(new KeyStoreKeyFactory(new ClassPathResource("myjwt.jks"), "password".toCharArray()).getKeyPair("jwt"));
return tokenEnhancer;
}
}
解决方案
JSON Web 令牌 (JWT) 身份验证技术不需要数据库表或数据存储来保留生成的令牌。令牌是使用加密算法生成的。
当您调用登录服务时,令牌是使用有效负载和秘密值生成的。如果您的有效负载相同,您将不会获得具有相同秘密值的新令牌值。
您可以参考此链接以获取有关 JWT 工作原理的更多信息。 https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec
推荐阅读
- recursion - 汇编中的阿克曼函数 - 陷入无限递归
- dialogflow-es - 在 Dialogflow 中创建的 Google Assistant 应用程序的密码
- azure - 无法通过 RDP 连接到 Azure 虚拟机
- bixby - 使用 EL 作为布局宏表达式的参数
- python - 在 Python 中,为什么我的 for 循环仅在特定数字之前的数字是数组中的最后一个数字时才排除该数字?
- networking - 您可以在法定人数中混合服务器品牌吗?
- sql - SQL Server 日期时间说明
- php - 表字段将 VARCHAR 记录为 0
- mysql - 如何在两个表之间插入关系,其中确定的数据集与主键相关?
- swift - 如何打印数组的偶数总和/平均和奇数总和/平均?