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

Posted

技术标签:

【中文标题】Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求【英文标题】:Spring boot security - allowing user requests with expired JWT token 【发布时间】:2021-08-27 16:06:33 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的建议。正如我所指出的,我只需要一些 API。这就是为什么我需要在那个时候获得一个请求并继续执行它。例如,类似的东西; .jwt().decoder(jwtDecoder()).and().authenticationEntryPoint(new AuthenticationEntryPoint() @Override public void begin(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) 抛出 IOException, ServletException log.info("sadasdad" ); );我在日志点需要的是 res.proceed

以上是关于Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot + JWT 实现安全验证 ---auth0.jwt

Spring Boot 安全配置忽略允许的端点

Spring Boot 安全性允许来自给定 IP 地址的请求

Spring Boot 2 安全性 - 预认证令牌 - 允许运行状况检查

用户登录时的 Spring Boot 安全自定义消息

spring boot整合jwt 实现前后端分离登录认证及授权