我正在使用PassportJS对我网站上的Facebook用户进行身份验证。棘手的部分是我首先使用简单的Facebook权限登录用户,每个用户在使用Facebook登录时默认授予权限,但用户根据他们的行为,以后可以启用授予Fanpage管理员权限。
当我想将Fanpage Admin用户重定向到其他网址时,我处理这两种授权都没有问题,我不能,因为Passport只允许我为我的Facebook策略设置一个回调网址,因为所有从Facebook发出的回调结束于/ 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));
我需要有多个successRedirect网址,具体取决于用户是否授予正常权限或Facebook管理员权限。我想将FBAdmins重定向到另一个URL,而不是/ admin root。
如果不创建新的Facebook策略,我怎么能实现这一目标呢?
答案 0 :(得分:2)
app.get('/ auth / facebook / callback',passport.authenticate('facebook',passportOptions)
事实上,应该发送到自定义回调,您可以在其中处理重定向到适当的资源。
示例:
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);
});
答案 1 :(得分:0)
感谢Biba提供的反馈,我可以想出一个转机。这是解决方案。顺便说一下,'请求' module是我使用的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);
});