cors在github oauth上发表

时间:2017-02-10 01:34:18

标签: javascript github xmlhttprequest cors

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

1 个答案:

答案 0 :(得分:5)

通过发送正确的响应标头the actual GitHub API endpoints support CORSa 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