【发布时间】:2019-05-05 17:52:33
【问题描述】:
我已经使用 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;
}
}
【问题讨论】:
-
@dur 实际上,我从 Postman 调用 OAuth2 令牌授权端点,以查看它是否为每个新调用生成新令牌.....但它给了我相同的令牌,但到期时间减少.. .
-
@dur 如果我重新启动授权服务器,那么它会给我一个新的令牌............所以如果是由于缓存,我们如何防止这种情况
-
你必须自己写
TokenStore。您可以尝试编写InMemoryTokenStore的子类。 -
@dur 是的,我看到了here 的一个解决方案......但问题是他正在使用
JdbcTokenStore代替authenticationKeyGenerator。就我而言,我需要JwtTokenStore对,但它没有authenticationKeyGenerator功能 -
这对于 Stackoverflow 来说太宽泛了。如果遇到问题,您必须尝试实现自己的
TokenStore并编写一个新问题(使用该代码)。
标签: java spring oauth-2.0 jwt spring-security-oauth2