import request from 'superagent';
const self = this;
request
.post('https://github.com/login/oauth/access_token')
.set('Content-Type', 'multipart/form-data')
.query({
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
callback: 'http://127.0.0.1:3000/callback',
code,
state,
})
.end((err, res) => {
const token = res.body.access_token;
console.log(token);
self.setToken(token);
});
上面的代码会给我一个像这样的错误
XMLHttpRequest无法加载 https://github.com/login/oauth/access_token?client_id=112asdecf3805fdada12& ... 127.0.0.1%3A3000%2Fcallback&安培;代码= 434ebd7bb98d9809bf6e&安培;状态= HelloWorld1234。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://127.0.0.1:3000” 访问。
我不知道为什么即使我已经使用github和回调网址注册了oauth应用程序http://127.0.0.1:3000/callback
答案 0 :(得分:5)
通过发送正确的响应标头the actual GitHub API endpoints support CORS,a known issue创建OAuth访问令牌的https://github.com/login/oauth/access_token
端点不支持来自Web应用程序的CORS请求。
此案例的具体解决方法是使用https://github.com/prose/gatekeeper:
Gatekeeper:允许客户端应用程序与GitHub共舞OAuth。
由于某些与安全相关的限制,Github阻止您在仅客户端应用程序上实现OAuth Web应用程序流。
这是一个真正的无赖。所以我们建立了Gatekeeper,这是你需要的缺失部分才能使它工作。
一般的解决方法是:使用像https://cors-anywhere.herokuapp.com/
这样的开放式反向代理var req = new XMLHttpRequest();
req.open('POST',
'https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token',
true);
req.setRequestHeader('Accept', 'application/json');
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send('code=' + encodeURIComponent(location.query.code) +
'&client_id=foo' +
'&client_secret=bar');
...
另见How to use Cors anywhere to reverse proxy and add CORS headers。