2012-12-01 6 views
3

Bon, donc en utilisant passport.js fonctionne, et fonctionne bien, d'après ce que j'ai vu. Cependant, je ne suis pas sûr de savoir comment exclure correctement certains utilisateurs. Si l'application est destinée à avoir un accès restreint, plutôt que de simplement fournir à l'utilisateur une méthode pour se connecter, comment puis-je restreindre le login via passport.js? En l'état, les utilisateurs peuvent simplement visiter le /login et se connecter avec leur compte Google, obtenant ainsi l'accès aux internes.Restreindre l'accès de connexion - Passport.js, authentification Google

Répondre

9

Voici une façon de le faire, avec des commentaires tout au long. La principale chose est de comprendre cette page de l'auteur: http://passportjs.org/guide/authenticate/, que je vous expliquer un peu plus dans cet exemple ...

Il pourrait être plus facile à lire de bas en haut:

var authenticate = function(req, success, failure) { 

    // Use the Google strategy with passport.js, but with a custom callback. 
    // passport.authenticate returns Connect middleware that we will use below. 
    // 
    // For reference: http://passportjs.org/guide/authenticate/ 
    return passport.authenticate('google', 
     // This is the 'custom callback' part 
     function (err, user, info) { 

      if (err) { 
       failure(err); 
      } 
      else if (!user) { 
       failure("Invalid login data"); 
      } 
      else { 
       // Here, you can do what you want to control 
       // access. For example, you asked to deny users 
       // with a specific email address: 
       if (user.emails[0].value === "[email protected]") { 
        failure("User not allowed"); 
       } 
       else { 
        // req.login is added by the passport.initialize() 
        // middleware to manage login state. We need 
        // to call it directly, as we're overriding 
        // the default passport behavior. 
        req.login(user, function(err) { 
         if (err) { 
          failure(err); 
         } 
         success(); 
        }); 
       } 
      } 
     } 
    ); 
}; 

Une idée est de envelopper le code ci-dessus dans un peu plus middleware, pour le rendre plus facile à lire:

// This defines what we send back to clients that want to authenticate 
// with the system. 
var authMiddleware = function(req, res, next) { 

    var success = function() { 
     res.send(200, "Login successul"); 
    }; 

    var failure = function(error) { 
     console.log(error); 
     res.send(401, "Unauthorized"); 
    }; 

    var middleware = authenticate(req, success, failure); 
    middleware(req, res, next); 
}; 


// GET /auth/google/return 
// Use custom middleware to handle the return from Google. 
// The first /auth/google call can remain the same. 
app.get('/auth/google/return', authMiddleware); 

(tout cela suppose que nous utilisons express.)

+1

Wow, je suis désolé. Je n'ai jamais accepté ça. – skeggse

0

Essayez ceci.

googleLogin: function(req, res) { 
     passport.authenticate('google', { failureRedirect: '/login', scope: ['https://www.googleapis.com/auth/plus.login', 'https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'] }, function(err, user) { 
      req.logIn(user, function(err) { 
      if (err) { 
       console.log(err); 
       res.view('500'); 
       return; 
      } 
      var usrEmail = user['email']; 
       if(usrEmail.indexOf("@something.com") !== -1) 
       { 
       console.log('successful'); 
       res.redirect('/'); 
       return; 
       } 
       else 
       { 
       console.log('Invalid access'); 
       req.logout(); 
       res.view('403'); 
       return; 
       } 

      }); 
     })(req, res); 
     } 

*