You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取GitHub OAuth access_token?生产环境遇CORS错误求助

解决GitHub OAuth获取access_token的CORS错误问题

问题根源

GitHub的/login/oauth/access_token接口不允许前端直接发起跨域请求,这是刻意的设计:一方面该接口需要用到client_secret,这个密钥绝对不能暴露在前端代码中;另一方面GitHub没有为这个接口配置支持前端跨域的CORS响应头,所以浏览器会直接拦截请求,不管你把参数放在URL还是请求体里都没用。

正确解决方案:后端中转请求

获取access_token的步骤必须在你的后端服务中完成,前端只需要把拿到的code传给后端,由后端去调用GitHub的接口,再把结果返回给前端。具体步骤如下:

  • 前端拿到/authorize返回的code后,向自己的后端接口发起POST请求,携带code参数。
  • 后端收到code后,调用GitHub的/login/oauth/access_token接口,传入client_id、client_secret和code,同时设置Accept: application/json头方便解析返回结果。
  • 后端将GitHub返回的access_token(或错误信息)转发给前端。

后端示例代码(Node.js/Express)

const express = require('express');
const axios = require('axios');
const app = express();

// 解析JSON请求体
app.use(express.json());

// 中转接口
app.post('/api/github/swap-token', async (req, res) => {
  const { code } = req.body;
  // 这里换成你的GitHub OAuth应用凭证
  const GITHUB_CLIENT_ID = '你的client_id';
  const GITHUB_CLIENT_SECRET = '你的client_secret';

  try {
    const githubRes = await axios.post(
      'https://github.com/login/oauth/access_token',
      {
        client_id: GITHUB_CLIENT_ID,
        client_secret: GITHUB_CLIENT_SECRET,
        code: code
      },
      {
        headers: { 'Accept': 'application/json' }
      }
    );
    // 直接返回GitHub的响应数据给前端
    res.json(githubRes.data);
  } catch (err) {
    res.status(err.response?.status || 500).json({
      error: err.response?.data?.error || '获取token失败'
    });
  }
});

app.listen(3001, () => console.log('后端服务运行在3001端口'));

额外注意事项

  • 绝对不要在前端代码中写入client_secret,一旦泄露,攻击者可以冒充你的应用发起OAuth请求。
  • 如果你的后端用其他语言(Python/Java等),逻辑是一样的:发起POST请求到GitHub的接口,携带必要参数,然后转发结果。

内容的提问来源于stack exchange,提问作者user2746732

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:34:51