Я в основному шукав те саме. Зокрема, я хотів наступного:
- Використовувати 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("/");
}
});
});
У будь-якому випадку, цей підхід був здебільшого розроблений таким, щоб бути гнучким та простим. Я впевнений, що існує безліч способів її вдосконалити. Якщо у вас є якісь, я дуже б хотів ваших відгуків.
EDIT: Це спрощений приклад. У виробничій системі ви ніколи не хочете зберігати та порівнювати паролі у простому тексті. Як зазначає коментатор, є вкладені файли, які допоможуть керувати безпекою пароля.
omniauth
(рейки) або пітонsocial-auth
. Користувачі PHP (та інших поширених мов веб-серверів) також можуть додавати їх еквівалент.