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 的源代码并尝试提供一个实际的实现。
另一件事,这绝对不是请求的选项。我建议查看Client
和RoundTripper
。后者是一个接口,您可以用您自己的实现替换正在使用的接口,解决方案可能会要求您这样做。
在请求头中,来源应该是'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 登录链接
带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]
spring boot with react前端oauth2代理CORS问题