Ich suchte im Grunde das Gleiche. Insbesondere wollte ich Folgendes:
- Verwendung von express.js, das die Middleware-Funktionen von Connect einschließt
- "Formularbasierte" Authentifizierung
- Detaillierte Kontrolle darüber, welche Routen authentifiziert werden
- Ein Datenbank-Backend für Benutzer / Passwörter
- Verwenden Sie Sitzungen
Am Ende habe ich meine eigene Middleware-Funktion erstellt check_auth
, die ich als Argument für jede Route übergeben möchte, die authentifiziert werden soll. check_auth
Überprüft lediglich die Sitzung. Wenn der Benutzer nicht angemeldet ist, leitet er ihn wie folgt auf die Anmeldeseite weiter:
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();
}
Dann stelle ich für jede Route sicher, dass diese Funktion als Middleware übergeben wird. Beispielsweise:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Schließlich müssen wir den Anmeldevorgang tatsächlich abwickeln. Das ist unkompliziert:
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("/");
}
});
});
In jedem Fall war dieser Ansatz meist flexibel und einfach gestaltet. Ich bin sicher, es gibt zahlreiche Möglichkeiten, dies zu verbessern. Wenn Sie welche haben, würde ich mich sehr über Ihr Feedback freuen.
EDIT: Dies ist ein vereinfachtes Beispiel. In einem Produktionssystem möchten Sie niemals Passwörter im Klartext speichern und vergleichen. Wie ein Kommentator hervorhebt, gibt es Bibliotheken, die bei der Verwaltung der Kennwortsicherheit helfen können.
omniauth
(Schienen) oder Python entsprichtsocial-auth
. PHP-Benutzer (und andere gängige Webserversprachen) können auch ihre Entsprechung hinzufügen.