首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在passport-github2 (NodeJS)中调用redirect_uri

在passport-github2 (NodeJS)中调用redirect_uri
EN

Stack Overflow用户
提问于 2016-01-26 02:16:43
回答 1查看 667关注 0票数 0

使用passport-github2通过Github电子邮件登录用户。根据示例实现/auth/github/auth/github/callback

代码语言:javascript
复制
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调用中得到了正确的结果。不确定我是否正确地看到了这一点。

EN

回答 1

Stack Overflow用户

发布于 2016-01-26 18:40:01

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

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

代码语言:javascript
复制
// 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上的authenticator:

代码语言:javascript
复制
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);
});

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

代码语言:javascript
复制
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解码,相当于身份验证中间件中的编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34999458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档