github oauth 上的 cors 问题

Posted

技术标签:

【中文标题】github oauth 上的 cors 问题【英文标题】:cors issue on github oauth 【发布时间】:2017-06-28 06:03:10 【问题描述】:

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&code=434ebd7bb98d9809bf6e&state=HelloWorld1234。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://127.0.0.1:3000” 访问。

我不知道为什么即使我已经使用 github 注册了 oauth 应用程序并且回调 url 是 http://127.0.0.1:3000/callback

【问题讨论】:

understand CORS 【参考方案1】:

虽然所有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。

【讨论】:

用户在向不受信任的开放反向代理提供其客户端 ID 和机密方面应该有多关心? @osowskit 显然他们应该关注。使用风险自负。如果代理的所有者想要从请求中记录凭据,他们可以。这就是为什么在他们自己的站点上运行 Gatekeeper 或其他这样的代理当然会更好。 (以及为什么我说开放反向代理是一个更“通用的解决方案”,用于解决不选择接收跨域 XHR/Fetch 请求的站点的 CORS 限制。) 或使用 AWS API Gateway 之类的东西来创建您自己的授权调用并为您的 client_secret 保密

以上是关于github oauth 上的 cors 问题的主要内容,如果未能解决你的问题,请参考以下文章

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

如何修复 react app 和 coinbase connect api 上的 cors 错误

在 vue 中使用 axios 的 Cors 和预检错误

Google OAuth2:重定向已被 CORS 政策阻止:请求需要预检,不允许遵循跨域重定向

Spring + Angular 2 + Oauth2 + CORS 的 CSRF 问题

谷歌表格 API 请求上的 CORS 授权