Je cherchais essentiellement la même chose. Plus précisément, je voulais ce qui suit:
- Pour utiliser express.js, qui englobe la capacité de middleware de Connect
- Authentification "basée sur le formulaire"
- Contrôle granulaire des itinéraires authentifiés
- Un back-end de base de données pour les utilisateurs / mots de passe
- Utiliser des sessions
J'ai fini par créer ma propre fonction middleware check_auth
que je transmets comme argument à chaque route que je veux authentifier. check_auth
vérifie simplement la session et si l'utilisateur n'est pas connecté, puis les redirige vers la page de connexion, comme ceci:
function check_auth(req, res, next) {
// if the user isn't logged in, redirect them to a login page
if(!req.session.login) {
res.redirect("/login");
return; // the buck stops here... we do not call next(), because
// we don't want to proceed; instead we want to show a login page
}
// the user is logged in, so call next()
next();
}
Ensuite, pour chaque itinéraire, je m'assure que cette fonction est passée en tant que middleware. Par exemple:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Enfin, nous devons réellement gérer le processus de connexion. C'est simple:
app.get('/login', function(req, res) {
res.render("login", {layout:false});
});
app.post('/login', function(req, res) {
// here, I'm using mongoose.js to search for the user in mongodb
var user_query = UserModel.findOne({email:req.body.email}, function(err, user){
if(err) {
res.render("login", {layout:false, locals:{ error:err } });
return;
}
if(!user || user.password != req.body.password) {
res.render("login",
{layout:false,
locals:{ error:"Invalid login!", email:req.body.email }
}
);
} else {
// successful login; store the session info
req.session.login = req.body.email;
res.redirect("/");
}
});
});
Quoi qu'il en soit, cette approche a été conçue principalement pour être flexible et simple. Je suis sûr qu'il existe de nombreuses façons de l'améliorer. Si vous en avez, j'aimerais beaucoup vos commentaires.
EDIT: Ceci est un exemple simplifié. Dans un système de production, vous ne voudriez jamais stocker et comparer des mots de passe en texte brut. Comme le souligne un commentateur, il existe des bibliothèques qui peuvent aider à gérer la sécurité des mots de passe.
omniauth
(rails) ou pythonsocial-auth
. Les utilisateurs de PHP (et d'autres langages de serveur Web courants) devraient également se sentir libres d'ajouter leur équivalent.