在passport-github2(NodeJS)中调用redirect_uri

时间:2016-01-25 18:16:43

标签: node.js oauth passport.js

使用passport-github2使用Github电子邮件登录用户。按示例实施/auth/github/auth/github/callback

router.get('/auth/github', passport.authenticate('github', {
  scope: [ 'user:email' ]
}));

router.get('/auth/github/callback',
  passport.authenticate('github', { failureRedirect: '/login' }),
  function (req, res) {
    res.redirect('/');
});

工作正常。

下一步是使用redirect_uri,以便在完成身份验证流程后,实际上将未经身份验证的用户登陆到需要身份验证的网页上。考虑使用?redirect_uri=.../auth/github/callback?[landed_at]对用户进行身份验证,以便我可以相应地更改回调处理程序中的res.redirect('/');行。

似乎无法找到将redirect_uri参数传递给passport的正确方法,所以我在callback调用后立即回复。不确定我是否正确看到这一点。

1 个答案:

答案 0 :(得分:1)

挖掘a bit deeper并找到它,发布解决方案以供参考:

首先,在重定向进行身份验证时,将原始URL添加为查询参数,以便可以进一步推送。 Base64编码总是有帮助的。

// authentication middleware
router.use(function (req, res, next) {
  if (req.user) { // or choose your own way of passing auth info
    return next();
  }

  // not authenticated, redirect to oauth flow
  var redirect_uri = new Buffer(req.originalUrl);
  res.redirect('/auth/github?redirect_uri=' + redirect_uri.toString('base64'));
});

然后,将参数传递给回调URL上的验证器:

router.get('/auth/github', function (req, res, next) {
  var callbackURL = '/auth/github/callback';
  if (req.query.redirect_uri) {
    callbackURL += '?redirect_uri=' + req.query.redirect_uri;
  }
  passport.authenticate('github', {
    scope: [ 'user:email' ],
    callbackURL: callbackURL
  })(req,res,next);
});

最后,使用回调处理程序中的参数:

router.get('/auth/github/callback', function (req, res, next) {
  var redirect_uri = '/';
  if (req.query.redirect_uri) {
    // prepend host to avoid open redirects
    redirect_uri = config.HOST + '/' +
                   new Buffer(req.query.redirect_uri, 'base64').toString();
  }
  passport.authenticate('github', {
    failureRedirect: '/login',
    successRedirect: redirect_uri
  })(req, res, next);
});

注意回调中的Base64解码,与auth中间件中的编码相对应。