使用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
调用后立即回复。不确定我是否正确看到这一点。
答案 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中间件中的编码相对应。