我一直在努力为springboot 2和oauth 2.3设置CORS的正确方法。 因此,我创建了一个简单的一类应用程序,希望它能按预期运行,但可惜情况并非如此。
我通过AXIOS调用了该应用程序。
@CrossOrigin(origins = "*")
@RestController
@EnableResourceServer
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@PostMapping("/getData")
public String getData(Principal principal) {
return "GotData";
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
final CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList(new String[] {"*"}));
configuration.setAllowedMethods(Arrays.asList(new String[] {"HEAD",
"GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"}));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Arrays.asList(new String[] {"*"}));
configuration.setExposedHeaders(Arrays.asList(new String[] {"X-Auth-Token","Authorization","Access-Control-Allow-Origin","Access-Control-Allow-Credentials"}));
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
这是进行调用的js方法
async bla() {
var accessToken = await Vue.prototype.$auth.getAccessToken();
axios.post('http://localhost:8055/getData','whaever',
{headers: {
'Authorization': ['Bearer ' + accessToken],
'Access-Control-Allow-Origin': '*'
}}
).then(response => {
alert(response.data)
}).catch(e => {
alert('failed ' + e.message);
})
}
结果是:“错误”:“未经授权” Axios没有发送Bearer令牌或access-control-allow-origin头。
当我将Spring Rest端点更改为GetMethod并按如下所示传递access_token时。
Spring class change
@CrossOrigin(origins = "*")
@RestController
@EnableResourceServer
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@GetMapping("/getData")
public String getData(Principal principal) {
return "GotData ";
}
和js调用:
async bla() {
var accessToken = await Vue.prototype.$auth.getAccessToken();
axios.get('http://localhost:8055/getData',
{headers: {
//'Authorization': ['Bearer ' + accessToken],
'Access-Control-Allow-Origin': '*'
},
params: {
'access_token': accessToken
}
}
).then(response => {
alert(response.data)
}).catch(e => {
alert('failed ' + e.message);
})
},
在使用oauth 2.3设置Spring Boot 2的CORS时,有人可以建议我做错了什么吗? 或遇到相同的问题。我以为这是标准设置并可以正常工作,但一直在努力使其工作到现在我要破解的代码,以继续前进,直到我可以使用Post方法为止。
添加Chrome网络捕获: Get method headers, success response, just access_token as param
,这是失败的Post呼叫: failed Post headers failed 401 result 谢谢
更新: 感谢您的所有回复。 围着圈子跑来跑去,试图将Bearer令牌发送到春天。 -当尝试通过邮递员在数组中发送承载令牌时,我得到access_denied:需要完全身份验证,因此Spring应用程序看不到身份验证令牌 -当我发送带有Bearer令牌作为字符串的Postman Post呼叫时,它起作用 -当我发送带有access_token参数的邮递员帖子时,效果也很好
-当我尝试通过Axios将Bearer令牌作为字符串或数组发送时,我的手指 -当我通过axios为该帖子发送一个access_token时,它的工作原理与get请求一样。 启用Oauth2的Not CORS时,Bearer令牌功能可与Post一起使用。 该功能也可以在不启用EnableResourceServer且禁用oauth2的情况下使用。 如果找不到可行的解决方案,就无法继续花费时间。
comms已经过https了,所以现在暂时将access_tokens作为参数发送,并可能尝试使用scala / golang / kotlin或其他具有较少抽象层的docker尝试使用其他Java框架,并查看它是否可以更轻松地解决类似阻止程序的问题这些。
很高兴找出如何解决此承载令牌问题,因此,如果有人想运行我发布的带有承载令牌的有效解决方案的代码,请告诉我结果。
也许我缺少一些mvn库来使其正常工作? 另外,也可以禁止Axios并查看jquery是否会解决问题,尽管每个人在搜索最佳实践/趋势时都说jquery已过时。如果jquery没有设置承载令牌,则access_token可以解决。不想花更多时间解决问题。
如果我发送一个access_token参数,则可能会出现Oauth2 Spring安全问题,而不是CORS,因为该调用有效,但是如果我尝试发送承载身份验证令牌,则失败。
我从在线论坛上猜测,Spring Boot不会在预调用握手中发送正确的标头,因此,无论哪个lib wrap ajax调用都将删除auth标头(尽管可能是错误的)。 PS !!在发布此问题之前,我也尝试过使用纯ajax调用,而ajax也未发送承载令牌。
无论哪种方式,如果其他人陷入困境,一种快速的解决方法是在rest调用上设置access_token参数,而不是auth承载令牌。
此外,我有上面所示的POST axios调用,它不需要CORS,并且可以与发送的承载令牌一起按预期工作。