如何获取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
相关产品推荐
相关产品推荐

