Github 使用 Express 和 Ember.js 的 OAuth 流程

Github OAuth flow with Express and Ember.js

我对 Express.js 和 Github OAuth api 和 运行 很陌生。

我的流程是,用户从 Ember.js 应用程序中单击 link,它指向 Express 服务器上的路由。重定向到 Github oauth 路由。

router.route('/oauth')
  .get(function(req, res){
    res.redirect('https://github.com/login/oauth/authorize?client_id=XXXX&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fcallback&state=1234')
  })

应用通过身份验证后,用户将被重定向回回调路由

router.route('/callback')
  .get(function(req, res){
    var code = req.query.code
    res.redirect('https://github.com/login/oauth/access_token?client_id=XXXX&client_secret=YYYY&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fgood&code=' + code)
  })

返回代码。从这一点开始,我使用该代码获取访问令牌。访问令牌返回,但它作为下载到我的机器的文件而不是对我的服务器的响应返回。我错过了什么?

不要进行第二次重定向。相反,您想为令牌交换执行 GET 请求。您的重定向 url 参数必须与原始重定向 url 匹配(确保它是 url 编码):http%3A%2F%2Flocalhost%3A8080%2Fcallback

var https = require('https');

var options = {
  hostname: 'github.com',
  port: 443,
  path: '/login/oauth/access_token?client_id=XXXX&client_secret=YYYY&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fcallback&code=' + code',
  method: 'GET'
};

var req = https.request(options, function(res) {
  console.log("statusCode: ", res.statusCode);
  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    process.stdout.write(d);
  });
});
req.end();

req.on('error', function(e) {
  console.error(e);
});

https://nodejs.org/api/https.html