In pratica stavo cercando la stessa cosa. In particolare, volevo quanto segue:
- Per utilizzare express.js, che racchiude la capacità del middleware di Connect
- Autenticazione "basata sul modulo"
- Controllo granulare su quali percorsi sono autenticati
- Un back-end di database per utenti / password
- Usa le sessioni
Quello che ho finito per fare è stato creare la mia funzione middleware check_auth
che passo come argomento per ogni route che voglio autenticare. check_auth
controlla semplicemente la sessione e se l'utente non ha effettuato l'accesso, quindi li reindirizza alla pagina di accesso, in questo modo:
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();
}
Quindi, per ogni percorso, mi assicuro che questa funzione sia passata come middleware. Per esempio:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Infine, dobbiamo effettivamente gestire il processo di accesso. Questo è semplice:
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("/");
}
});
});
Ad ogni modo, questo approccio è stato principalmente progettato per essere flessibile e semplice. Sono sicuro che ci sono molti modi per migliorarlo. Se ne hai, mi piacerebbe molto il tuo feedback.
EDIT: questo è un esempio semplificato. In un sistema di produzione, non vorresti mai archiviare e confrontare le password in testo semplice. Come sottolinea un commentatore, ci sono librerie che possono aiutare a gestire la sicurezza delle password.
omniauth
(rotaie) o pitonesocial-auth
. Gli utenti di PHP (e altre lingue comuni dei server Web) dovrebbero sentirsi liberi di aggiungere anche il loro equivalente.