使用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调用中得到了正确的结果。不确定我是否正确地看到了这一点。
发布于 2016-01-26 18:40:01
挖掘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上的authenticator:
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解码,相当于身份验证中间件中的编码。
https://stackoverflow.com/questions/34999458
复制相似问题