Я в основном искал то же самое. В частности, я хотел следующее:
- Использовать express.js, который включает в себя возможности промежуточного программного обеспечения Connect
- Проверка подлинности на основе форм
- Детальный контроль над тем, какие маршруты аутентифицированы
- База данных для пользователей / паролей
- Используйте сеансы
В итоге я создал свою собственную функцию промежуточного программного обеспечения, check_auth
которую я передаю в качестве аргумента каждому маршруту, который я хочу аутентифицировать. check_auth
просто проверяет сеанс и, если пользователь не вошел в систему, затем перенаправляет их на страницу входа, например так:
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();
}
Затем для каждого маршрута я гарантирую, что эта функция передается как промежуточное ПО. Например:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Наконец, нам нужно обработать процесс входа в систему. Это просто:
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("/");
}
});
});
Во всяком случае, этот подход был в основном разработан, чтобы быть гибким и простым. Я уверен, что есть множество способов улучшить это. Если у вас есть, я очень хотел бы получить ваши отзывы.
РЕДАКТИРОВАТЬ: это упрощенный пример. В производственной системе вы никогда не захотите хранить и сравнивать пароли в виде простого текста. Как указывает комментатор, есть библиотеки, которые могут помочь в управлении паролем.
omniauth
(rails) или pythonsocial-auth
. Пользователи PHP (и других распространенных языков веб-сервера) также могут свободно добавлять свои эквиваленты.