2016-04-28 84 views
2

我正在使用oauth2处理用户通过Facebook登录。我在golang api中调用授权服务器时发生错误。Facebook Oauth CORS错误

这是网络错误。

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 => { ... }

Golang函数调用OAuth授权服务器(脸谱)。

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问题

我的请求头是空,是值得考虑的?

编辑没有添加-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.

+0

不确定这会有帮助,因为我找不到任何方法来设置'请求模式',但它可能会帮助您了解需要完成的操作。基本上,你的头不是问题。这些问题出现在响应头文件中,这些头文件需要指明您可以加载页面。如果没有“Access-Control-Allow-Origin”白名单列出请求资源的域,浏览器应该阻止该响应。错误声称你可以为你的请求设置一个“no-cors”模式,这就是需要做的。时间允许,我会阅读Request.go的源代码并尝试提供实际的实现。 – evanmcdonnal

+0

另一件事,它绝对不是请求上的选项。我建议查看'Client'和'RoundTripper'。后者是一个接口,你可以用自己的实现来替换正在使用的接口,这可能是解决方案需要你这样做的。 – evanmcdonnal

+0

在请求头文件中,起源应该是'localhost:7001',而不是null?或者是facebook oauth链接没有白名单的问题,因为它没有'Access-control-allow-origin'头部? – goda

回答

0

使用wireshark或tcpdump的网络跟踪可以帮助找到正在发生的事情或使用任何Firefox插件捕获HTTP流量来捕获实时头文件。