PassportJS上的Facebook策略可以有多个回叫url吗?

我使用PassportJS在我的网站上对Facebook用户进行身份validation。 其中最棘手的部分是,我首先使用简单的Facebook权限login用户,每个用户默认授予Facebooklogin权限,但用户根据他们的行为,以后可以授予Fanpage Admins权限。

我没有问题处理这两个授权,hovewever,当我想redirectFanpage Admin用户到不同的url,我不能因为Passport只允许我为我的Facebook策略设置一个单一的callbackURL,因为所有来自Facebook的callback结束at / auth / facebook / callback。

var passportOptions = { successRedirect: '/admin/', failureRedirect: '/' } var fbAdminPermissions = { scope: ["email, manage_pages"] } var fbNormalPermissions = { scope: ["email"] } app.get('/auth/facebook', passport.authenticate('facebook', fbNormalPermissions)); app.get('/auth/facebookPages', passport.authenticate('facebook', fbAdminPermissions)); app.get('/auth/facebook/callback', passport.authenticate('facebook', passportOptions)); 

我需要有多个successRedirecturl取决于如果用户授予一般权限或Facebookpipe理员权限。 我想将FBAdminsredirect到另一个url,而不是/ admin root。

我希望如何实现这一点,而不是创造一个新的Facebook战略?

app.get('/ auth / facebook / callback',passport.authenticate('facebook',passportOptions)

实际上应该被发送到一个自定义的callback,你处理redirect到适当的资源。

例:

 app.get('/auth/facebook/callback', function(req, res, next) { passport.authenticate('facebook', function (err, user, info){ //do the redirect here as needed })(req, res, next); }); 

由于Biba的反馈,我可以想出一个转身。 这是解决scheme。 顺便说一句,“请求”模块是我使用的http处理程序,但是如果你愿意的话,你可以使用Express的“https”模块。

 var request = require('request'); var passportOptions = { successRedirect: '/admin', adminRedirect: '/admin/fanpages', failureRedirect: '/login' } app.get('/auth/facebook/callback', function(req, res, next) { passport.authenticate('facebook', function(err, user) { if (err) { return res.redirect(passportOptions.failureRedirect); } if (!user) { return res.redirect(passportOptions.failureRedirect); } req.login(user, function(err) { if (err) { return res.redirect(passportOptions.failureRedirect); } else { request.get('https://graph.facebook.com/' + user.facebookid + '/permissions?access_token=' + user.facebookToken, function(error, response, body) { var bodyJSON = JSON.parse(body); if (!error && response.statusCode == 200) { if (bodyJSON.data[0].manage_pages !== undefined) { //admin user permissions granted return res.redirect(passportOptions.adminRedirect); } else { //normal user permissions granted return res.redirect(passportOptions.successRedirect); } } else { return res.redirect(passportOptions.failureRedirect); } }) } }); })(req, res, next); });