我可以为PassportJS上的Facebook策略设置多个回调网址吗?

时间:2014-04-18 20:48:28

标签: node.js facebook passport.js

我正在使用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策略,我怎么能实现这一目标呢?

2 个答案:

答案 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);
});