Zasadniczo szukałem tego samego. W szczególności chciałem:
- Aby użyć express.js, który otacza możliwości oprogramowania pośredniego Connect
- Uwierzytelnianie „na podstawie formularza”
- Szczegółowa kontrola nad tym, które trasy są uwierzytelniane
- Back-end bazy danych dla użytkowników / haseł
- Użyj sesji
Skończyło się na tym, że stworzyłem własną funkcję oprogramowania pośredniego check_auth
, którą przekazuję jako argument do każdej trasy, którą chcę uwierzytelnić. check_auth
po prostu sprawdza sesję, a jeśli użytkownik nie jest zalogowany, następnie przekierowuje go na stronę logowania, w ten sposób:
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();
}
Następnie dla każdej trasy zapewniam, że ta funkcja jest przekazywana jako oprogramowanie pośrednie. Na przykład:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Wreszcie, musimy faktycznie obsługiwać proces logowania. Jest to proste:
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("/");
}
});
});
W każdym razie takie podejście zostało zaprojektowane głównie jako elastyczne i proste. Jestem pewien, że istnieje wiele sposobów, aby to poprawić. Jeśli masz jakieś, bardzo chciałbym poznać Twoją opinię.
EDYCJA: To jest uproszczony przykład. W systemie produkcyjnym nigdy nie chcesz przechowywać i porównywać haseł w postaci zwykłego tekstu. Jak zauważa komentator, istnieją biblioteki, które mogą pomóc w zarządzaniu bezpieczeństwem haseł.
omniauth
(szyny) lub pythonsocial-auth
. Użytkownicy PHP (i innych popularnych języków serwerów WWW) powinni również dodać swoje odpowiedniki.