在Spring Boot中验证JWT时,如何处理InvalidSignatureException?
我正在开发自己的SpringBoot认证服务器和资源服务器,它们工作正常。 身份验证服务器提供RS256 JWS令牌,并且资源服务器能够验证该令牌 我很高兴,我想知道如果我使用不同的RSA密钥对来验证JWS令牌会发生什么。结果是:在Spring Boot中验证JWT时,如何处理InvalidSignatureException?,spring,spring-boot,spring-security,jwt,spring-security-oauth2,Spring,Spring Boot,Spring Security,Jwt,Spring Security Oauth2,我正在开发自己的SpringBoot认证服务器和资源服务器,它们工作正常。 身份验证服务器提供RS256 JWS令牌,并且资源服务器能够验证该令牌 我很高兴,我想知道如果我使用不同的RSA密钥对来验证JWS令牌会发生什么。结果是: org.springframework.security.jwt.crypto.sign.InvalidSignatureException: RSA Signature did not match content at org.springframework
org.springframework.security.jwt.crypto.sign.InvalidSignatureException: RSA Signature did not match content
at org.springframework.security.jwt.crypto.sign.RsaVerifier.verify(RsaVerifier.java:55)
at org.springframework.security.jwt.JwtImpl.verifySignature(JwtHelper.java:287)
at org.springframework.security.oauth2.provider.token.store.jwk.JwkVerifyingJwtAccessTokenConverter.decode(JwkVerifyingJwtAccessTokenConverter.java:122)
at org.springframework.security.oauth2.provider.token.store.JwtTokenStore.convertAccessToken(JwtTokenStore.java:88)
at org.springframework.security.oauth2.provider.token.store.JwtTokenStore.readAccessToken(JwtTokenStore.java:80)
at org.springframework.security.oauth2.provider.token.store.jwk.JwkTokenStore.readAccessToken(JwkTokenStore.java:212)
at org.springframework.security.oauth2.provider.token.DefaultTokenServices.loadAuthentication(DefaultTokenServices.java:229)
at org.springframework.security.oauth2.provider.token.DefaultTokenServices$$FastClassBySpringCGLIB$$5a1f25c.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
at org.springframework.security.oauth2.provider.token.DefaultTokenServices$$EnhancerBySpringCGLIB$$14463cf2.loadAuthentication(<generated>)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationManager.authenticate(OAuth2AuthenticationManager.java:83)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:150)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
...
我的Spring/Boot依赖项:
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
...
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.0.RELEASE")
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-web')
compile("org.springframework.cloud:spring-cloud-starter-sleuth")
compile("org.springframework.security:spring-security-jwt")
...
}
我所尝试的:
中的句柄(从Stackoverflow中的其他答案来看,应该是请求还没有传递到MVC,所以没有用)@ControllerAdvice
- 通过
注册自定义ResourceServerConfigurerAdapter.configure(HttpSecurity)
(不知道为什么它帮不上忙,但已尝试)AuthenticationEntryPoint
- 编辑
尝试了@Jazzepi的建议,使用以下方法实现
或扩展HandlerExceptionResolver
:AbstractHandlerExceptionResolver
WebMvcConfigurator.extendHandlerExceptionResolvers(列表)
注册(它没有帮助,仍然输出与上面相同的响应)
编辑: 我如何构建和解码令牌?
完全遵循本教程: 如何重新处理这种情况?
SpringBoot附带了几个类,这些类将异常映射到抛出异常时要运行的方法 在此异常解析程序链中注册HandlerExceptionResolverComposite: ExceptionHandlerExceptionResolver,用于通过 ExceptionHandler方法 注释为的异常的ResponseStatusExceptionResolver 反应状态 DefaultHandlerExceptionResolver,用于解析已知的Spring异常 类型 我认为您需要创建自己的异常处理程序。它将使您有机会运行任何您想要的代码来响应您的特定异常。可能想要实现这个接口。但是请签出文档,因为Spring提供了丰富的抽象类,您可以扩展这些抽象类,这将使您的生活更轻松,而不是从头开始从接口编写 最后,您需要向Spring注册处理程序。这看起来是一个很好的方法 祝你好运 要进行故障排除,我将在中设置一个断点
org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java
,查看它是否在捕捉和处理您的异常(我想是的)
在春天,这些分解者之间有一个命令。您可能希望给您的异常赋予最高的顺序,以便它有机会在默认的异常之前处理该异常
@顺序(有序。最高优先级)
您可能还希望处理程序使用
response.senderro(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,例如getMessage())代码>发送错误,而不是处理ModelAndView()之类的东西。这是为了告诉spring要重定向到哪个网页。查看默认处理程序的各个方法,了解处理错误的不同方法。Spring Boot附带了几个类,这些类将异常映射到抛出这些异常时要运行的方法
在此异常解析程序链中注册HandlerExceptionResolverComposite:
ExceptionHandlerExceptionResolver,用于通过
ExceptionHandler方法
注释为的异常的ResponseStatusExceptionResolver
反应状态
DefaultHandlerExceptionResolver,用于解析已知的Spring异常
类型
我认为您需要创建自己的异常处理程序。它将使您有机会运行任何您想要的代码来响应您的特定异常。可能想要实现这个接口。但是请签出文档,因为Spring提供了丰富的抽象类,您可以扩展这些抽象类,这将使您的生活更轻松,而不是从头开始从接口编写
最后,您需要向Spring注册处理程序。这看起来是一个很好的方法
祝你好运
要进行故障排除,我将在中设置一个断点
org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java
,查看它是否在捕捉和处理您的异常(我想是的)
在春天,这些分解者之间有一个命令。您可能希望给您的异常赋予最高的顺序,以便它有机会在默认的异常之前处理该异常
@顺序(有序。最高优先级)
您可能还希望处理程序使用response.senderro(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,例如getMessage())代码>发送错误,而不是处理ModelAndView()之类的东西。这是为了告诉spring要重定向到哪个网页。查看默认处理程序的各个方法,了解处理错误的不同方法。请添加有关如何构建和解码令牌的代码感谢您的回复。已经更新了问题,你明白了吗?我也遇到了同样的情况,exceptionHandler将其作为RuntimeException处理,状态为500:(请添加有关您如何构建和解码令牌的代码感谢您的回复。已更新问题。您解决了吗?我也遇到了同样的情况,exceptionHandler将其作为RuntimeException处理,状态为500:(
{
"error": "invalid_token",
"error_description": "Invalid JWT/JWS: RSA Signature did not match content"
}
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
...
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.0.RELEASE")
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-web')
compile("org.springframework.cloud:spring-cloud-starter-sleuth")
compile("org.springframework.security:spring-security-jwt")
...
}
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if (ex instanceof InvalidSignatureException) {
ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
mav.addObject("key", "value");
return mav;
}
return null;
}