【问题标题】:Invoke redirect_uri in passport-github2 (NodeJS)在passport-github2(NodeJS)中调用redirect_uri
【发布时间】:2016-01-27 06:19:35
【问题描述】:

使用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 调用中立即将其取回。不确定我是否正确地看到了这一点。

【问题讨论】:

    标签: node.js oauth passport.js


    【解决方案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中间件中的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 2018-09-21
      • 1970-01-01
      • 2014-11-30
      • 2015-12-31
      • 2013-12-12
      • 2019-08-13
      • 2015-02-20
      相关资源
      最近更新 更多