【问题标题】:JWT Access Token is not generating on every token authorize callsJWT 访问令牌不会在每个令牌授权调用上生成
【发布时间】: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


【解决方案1】:

JSON Web 令牌 (JWT) 身份验证技术不需要数据库表或数据存储来保存生成的令牌。令牌是使用加密算法生成的。

当您调用登录服务时,令牌是使用有效负载和秘密值生成的。如果您的有效载荷相同,您将不会获得具有相同秘密值的新令牌值。

您可以参考此链接以获取有关 JWT 工作原理的更多信息。 https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2020-09-28
    • 2017-07-09
    • 2019-12-08
    • 1970-01-01
    • 2017-02-20
    • 2021-04-11
    • 2019-03-08
    相关资源
    最近更新 更多