【问题标题】:Can I have multiple callback urls for the Facebook strategy on PassportJS?我可以在 PassportJS 上为 Facebook 策略设置多个回调 url 吗?
【发布时间】:2014-06-03 10:24:06
【问题描述】:

我正在使用 PassportJS 在我的网站上对 Facebook 用户进行身份验证。棘手的部分是,我首先使用每个用户在登录 Facebook 时默认授予的简单 Facebook 权限登录用户,但用户稍后可以根据他们的行为启用授予粉丝专页管理员权限。

我在处理这两个授权时都没有问题,但是,当我想将 Fanpage Admin 用户重定向到不同的 URL 时,我不能,因为 Passport 只允许我为我的 Facebook 策略设置一个回调 URL,因为所有回调都进行了来自 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 url,具体取决于用户授予普通权限还是Facebook 管理员权限。我想将 FBAdmins 重定向到另一个 url,而不是 /admin root。

如果不制定新的 Facebook 策略,我希望如何实现这一目标?

【问题讨论】:

    标签: node.js facebook passport.js


    【解决方案1】:

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

    【讨论】:

    • 感谢比巴的回复。但是我怎么知道用户是管理员还是普通用户?在模型中,用户仅保存为“用户”,因为无需将其区分为“管理员”或“普通”。也就是说,UserA 以后可以授予普通权限或管理员权限,但对于系统来说,他仍然是 UserA。除了回调之外,没有办法区分他。在此示例中,您如何区分来自 FBNormalAuth 的 UserA 和来自 FBAdminAuth 的 UserA?
    • 这是您在应用程序逻辑中处理的事情。我使用了连接角色,你在用户模型上保存了一个角色列表,例如一个简单的角色名称列表 [“Admin”,“etc”]。稍后当您将用户从普通升级到管理员时,这将反映在重定向中。在您的回调中,您应该从存储中检索用户(即 Mongo 或类似),然后连接角色将测试特定角色的存在。 connect-roles 将自身注入到护照会话中的用户对象中。
    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多