Spring Security Oauth2 使用 token 访问资源服务器出现异常:Invalid token does not contain resource id (oauth2)

异常如图

查看资源服务器的日志

p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="access_denied", error_description="Invalid token does not contain resource id (oauth2)"

从上面的日志可以看出,异常日志输出的 class 是 OAuth2AuthenticationProcessingFilter 这个过滤器

对 OAuth2AuthenticationProcessingFilter 过滤器进行 debug 调试

可以看到上图中,断点已经进入到了 doFilter 过滤器的过滤和放行的方法中

继续打断点,发现这个方法里面在使用认证管理器的认证时,抛出了异常

再进行一次 debug 访问,我们看一下这个方法内部是怎么操作的,可以看到这个 AuthenticationManager 是一个接口,而对于的在这个地方调用 authenticate 的实现类是:OAuth2AuthenticationManager

进入这个方法以后,一直往下走,发现资源服务器对我们传入的 token 与授权服务器进行了一次远程认证,认证完以后,这个 token 是存在的,然后在这里他获取了一下访问授权服务器的资源服务器 id,而在这里出现了问题,当前资源服务器的 resourceId 为 oauth2,从授权服务器那边获取到的 resourceId 则是 resource,这样就可以知道,在我们资源服务器端是没有问题的,去查找一下授权服务器的问题

可以在授权服务器上面看到,咱们配置的资源服务器 id,均是配置在数据库的

查询一下数据库以后,发现 resourceId 的配置与资源服务器上面的不符,这样就导致了刚才的错误

解决方法,修改 resouce_ids 与资源服务器上面配置一致即可

posted @ 2020-03-29 00:47  高方也  阅读(7092)  评论(0编辑  收藏  举报