Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring Boot中验证JWT时,如何处理InvalidSignatureException?_Spring_Spring Boot_Spring Security_Jwt_Spring Security Oauth2 - Fatal编程技术网

在Spring Boot中验证JWT时,如何处理InvalidSignatureException?

在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

我正在开发自己的SpringBoot认证服务器和资源服务器,它们工作正常。 身份验证服务器提供RS256 JWS令牌,并且资源服务器能够验证该令牌

我很高兴,我想知道如果我使用不同的RSA密钥对来验证JWS令牌会发生什么。结果是:

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")
    ...
}
我所尝试的:

  • @ControllerAdvice
    中的句柄(从Stackoverflow中的其他答案来看,应该是请求还没有传递到MVC,所以没有用)
  • 通过
    ResourceServerConfigurerAdapter.configure(HttpSecurity)
    注册自定义
    AuthenticationEntryPoint
    (不知道为什么它帮不上忙,但已尝试)
  • 编辑
    尝试了@Jazzepi的建议,使用以下方法实现
    HandlerExceptionResolver
    或扩展
    AbstractHandlerExceptionResolver
然后尝试通过
WebMvcConfigurator.extendHandlerExceptionResolvers(列表)
注册(它没有帮助,仍然输出与上面相同的响应)


编辑:

我如何构建和解码令牌?
完全遵循本教程:

如何重新处理这种情况?

  • 启动身份验证和资源服务器
  • 从auth server获取令牌,并在资源服务器中使用该令牌一次,以使资源服务器在本地缓存公钥
  • 更改身份验证服务器中的密钥库文件并重新启动
  • 从重新启动的身份验证服务器获取新令牌
  • 在资源服务器中使用新令牌

  • 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;
        }