Facebook Oauth CORS 错误

Posted

技术标签:

【中文标题】Facebook Oauth CORS 错误【英文标题】:Facebook Oauth CORS error 【发布时间】:2016-08-23 19:16:06 【问题描述】:

我正在使用 oauth2 来处理通过 facebook 登录的用户。我在golang api中调用授权服务器时出现错误。

这是网络错误。

Fetch API cannot load https://www.facebook.com/dialog/oauth?client_id=1543358959292867&redirect_u…=email+public_profile&state=mUi4IpdY8yF5TNVVptMNNSn8IbVSZxJXTSEFM8Zg8LM%3D. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

网络信息(铬)

Request URL:https://www.facebook.com/dialog/oauth?client_id=1543358959292867&redirect_uri=http%3A%2F%2Flocalhost%3A7001%2FFBLogin%2FCallback&response_type=code&scope=email+public_profile&state=lkmenB4FjNOShUQzL0Gpymi1xsvauaL7TawmUjCyvI4%3D Request Method:GET Status Code:302 Remote Address:[2a03:2880:f003:c1f:face:b00c:0:25de]:443

请求标头

:authority:www.facebook.com :method:GET :path:/dialog/oauth?client_id=1543358959292867&redirect_uri=http%3A%2F%2Flocalhost%3A7001%2FFBLogin%2FCallback&response_type=code&scope=email+public_profile&state=KPbwnGWQoI7PHvwhJ_JvZ7RowPthjqpaDTgKVI5NHrM%3D :scheme:https accept:*/* accept-encoding:gzip, deflate, sdch accept-language:en-US,en;q=0.8 origin:null referer:http://localhost:3000/ user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/50.0.2661.86 Safari/537.36

调用服务器api的javascript函数。

let loginUrl = "http://localhost:7001/FBLogin" //server url let config = method: 'GET', mode: 'cors', fetch(loginUrl, config).then(response => ...

调用oauth授权服务器(facebook)的Golang函数。

func FBLogin(w http.ResponseWriter, r *http.Request) state, err := hashutil.GenerateRandomState() logutil.Fatal(err) url := config["fb"].AuthCodeURL(state) logutil.OauthSessionLogger(state) http.Redirect(w, r, url, 302)

我按照本指南在服务器端设置了正确的标头。 Setting HTTP headers in Golang

我似乎无法找到错误的来源。 (facebook API 开发人员控制台、服务器代码中的回调标头,还是启动调用的 javascript?我花了很多时间更改服务器标头,但错误仍然作为 CORS 问题持续存在。

我的请求标头中的来源为空,需要考虑吗?

edit 增加了 no-cors 模式的结果。

FBLogin 302 text/html SessionActions.js?524b:35 736 B 5 ms oauth?client_id=154335&redirect_uri=http%3A%2F%2Flocalhost%3A7001%2FFBLogin%2FCallback&D 302 text/html http://localhost:7001/FBLogin 611 B 57 ms login.php?skip_api_login=1&api_key=154335 200 所有三个调用都成功了,但即使它这么说也从未重定向到 oauth 页面。响应类型为“不透明”,状态为 0。

【问题讨论】:

不确定是否会有所帮助,因为我找不到任何设置“请求模式”的方法,但它可能会帮助您了解需要做什么。基本上,您的标题不是问题。问题出在响应标头中,需要表明您被允许加载页面。如果没有Access-Control-Allow-Origin 白名单请求资源的域,则浏览器应该阻止该响应。该错误声称您可以为您的请求设置no-cors 模式,这就是需要做的。时间允许,我会阅读 Request.go 的源代码并尝试提供一个实际的实现。 另一件事,这绝对不是请求的选项。我建议查看ClientRoundTripper。后者是一个接口,您可以用您自己的实现替换正在使用的接口,解决方案可能会要求您这样做。 在请求头中,来源应该是'localhost:7001',而不是null?还是 facebook oauth 链接没有将任何域列入白名单,因为它没有“Access-control-allow-origin”标头? 问题出在 FB 端,它没有 Access-Control-Allow-Origin,因此不允许其他域向该 URL 发出请求。该错误表明 Go 端有一个设置,您可以更改以便不检查 CORS。 【参考方案1】:

使用wireshark 或tcpdump 的网络跟踪可以帮助查找正在发生的事情或使用任何firefox 插件捕获http 流量以捕获实时标头。

【讨论】:

以上是关于Facebook Oauth CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot OAuth2 将内部用户与 Facebook/Google 登录链接

Spring Oauth2 中的 CORS 错误

带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]

spring boot with react前端oauth2代理CORS问题

尽管有 CORS,但在使用 jHipster oAuth 时出现未经授权的错误

在 React/Express 中使用 PassportJS 进行 Google OAuth 时出现 CORS 错误