首页 文章

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

提问于
浏览
1

我正在使用PassportJS在我的网站上验证Facebook用户 . 棘手的部分是我首先使用简单的Facebook权限登录用户,每个用户在使用Facebook登录时默认授予权限,但是用户(根据他们的行为)稍后可以启用授予Fanpage Admins权限 .

当我想将Fanpage Admin用户重定向到另一个url时,我没有问题处理这两个授权,我不能,因为Passport只允许我为我的Facebook策略设置一个回调URL,因为从Facebook结束的所有回调结束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));

我需要有多个successRedirect url,具体取决于用户是否授予正常权限或Facebook管理员权限 . 我想将FBAdmins重定向到另一个URL,而不是/ admin root .

如果不创建新的Facebook战略,我怎么能实现这一目标呢?

2 回答

  • 0

    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);
    });
    
  • 2

    感谢Biba提供的反馈,我可以想出一个转机 . 这是解决方案 . 顺便说一下,'request'模块是我使用的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);
    });
    

相关问题