我使用spring-security-oauth2来构建应用程序。一般来说,一切都运行正常,我有三个独立的客户端使用我创建的简单API。所有客户端应用程序都从不同的域调用API。所有应用程序都可以使用客户端凭据授予注册成员,然后获取密码授予访问权限和刷新令牌。
但是,对于所有三个客户端,当使用过期的访问令牌发送请求时,来自资源服务器的响应不包括Access-Control-Allow-Origin头。这是hal-browser和angular app的问题,因为它们依赖于具有Access-Control-Allow-Origin标头的响应。
在过期的令牌响应中包含Access-Control-Allow-Origin标头的弹簧方式是什么?
我有一个过滤器在zuul网关上添加以下标头,但是对于带有过期访问令牌的请求,过滤器永远不会被触发。
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, HEAD");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"X-Requested-With, WWW-Authenticate, Authorization, Origin, Content-Type, Version");
response.setHeader("Access-Control-Expose-Headers",
"X-Requested-With, WWW-Authenticate, Authorization, Origin, Content-Type");
答案 0 :(得分:4)
在深入了解Spring代码之后,结果发现此问题是由过滤器执行的顺序引起的。首先调用OAuth过滤器并抛出InvalidAccessToken异常,阻止我的CORS过滤器运行并添加必要的Acccess-Control-Allow-Origin标头。
添加注释
@Order(Ordered.HIGHEST_PRECEDENCE)
到我的CORS过滤器就行了。