Spring 启动安全性 - 允许用户请求使用过期的 JWT 令牌

问题描述

我有一些用户使用有效的 JWT 令牌访问某些 API,但由于他们的任务花费的时间比令牌过期时间长得多,当他们再次访问 API 时,JWT 令牌已经过期。他们不应该刷新他们的令牌,他们必须获得相同的令牌,并使用过期的令牌访问一些 API。

我正在使用 spring.security.oauth2.resourceserver 向我们的授权服务器进行身份验证。

因此,我想要实现的是,如果令牌来源正确且格式良好,即使令牌已过期,我也需要接受请求。

是的,我知道这似乎不是一个方法,但如果可能,请教育我。

我已经从 here 中阅读了 ClientHttpRequestInterceptor 并深入研究了 resource server 的源代码,但找不到合适的方法

解决方法

我完全建议您不要这样做,因为如果某个恶意用户从某人那里窃取了 JWT,他将能够永远请求受保护的资源,因为令牌不会过期。在这种情况下您应该做的是刷新令牌,请转到 docs for refreshing the access token

但出于知识目的,可以提供自定义 JwtDecoder 以按照您想要的方式验证 JWT。 您应该使用您的特定配置公开类型为 @BeanJwtDecoder,如下所示:

@Bean
public JwtDecoder jwtDecoder() {
    OAuth2TokenValidator<Jwt> myCustomJwtValidator = new MyImplementationOfOAuth2TokenValidator();
    NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withPublicKey(myPublicKey).build();
    jwtDecoder.setJwtValidator(myCustomJwtValidator);
    return jwtDecoder;
}

您可以在 documentation 上找到更多详细信息。