Вопрос

I am using PassportJS to authenticate a Facebook user on my website. The tricky part is that I first login the user with the simple Facebook permissions every user grants by default when logging with Facebook, but the user, depending on their behaviour, later can enable to grant Fanpage Admins permissions.

I have no problem handling both authorizations, hovewever, when I want to redirect the Fanpage Admin user to a different url, I can't because Passport only let me setup one single callback URL for my Facebook strategy, because all callbacks made from Facebook ends 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));

I need to have multiple successRedirect url depending if the user grant normal permissions or Facebook Admin permissions. I want to redirect the FBAdmins to another url, not to /admin root.

How can I achieve this, hopefully, without creating a new Facebook strategy?

Это было полезно?

Решение 2

Thanks to the feedback given by Biba, I could figured out a turn around. Here is the solution. And btw, the 'request' module is an http handler I use, but you could use Express' 'https' module if you want to.

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

Другие советы

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

should in fact be sent to a custom callback where you handle the redirect to appropriate resource.

example:

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);
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top