Tôi đã cơ bản tìm kiếm điều tương tự. Cụ thể, tôi muốn như sau:
- Để sử dụng express.js, bao bọc khả năng phần mềm trung gian của Connect
- Xác thực "dựa trên mẫu"
- Kiểm soát chi tiết về các tuyến đường được xác thực
- Một cơ sở dữ liệu phụ trợ cho người dùng / mật khẩu
- Sử dụng phiên
Điều cuối cùng tôi làm là tạo ra chức năng phần mềm trung gian của riêng mình check_auth
mà tôi chuyển qua làm đối số cho mỗi tuyến tôi muốn xác thực. check_auth
chỉ kiểm tra phiên và nếu người dùng chưa đăng nhập, sau đó chuyển hướng họ đến trang đăng nhập, như vậy:
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();
}
Sau đó, đối với mỗi tuyến, tôi đảm bảo chức năng này được truyền dưới dạng phần mềm trung gian. Ví dụ:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Cuối cùng, chúng ta cần thực sự xử lý quá trình đăng nhập. Điều này rất đơn giản:
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("/");
}
});
});
Ở mức độ nào, phương pháp này hầu hết được thiết kế linh hoạt và đơn giản. Tôi chắc chắn có nhiều cách để cải thiện nó. Nếu bạn có bất kỳ, tôi rất thích phản hồi của bạn.
EDIT: Đây là một ví dụ đơn giản. Trong một hệ thống sản xuất, bạn sẽ không bao giờ muốn lưu trữ và so sánh mật khẩu trong văn bản thuần túy. Như một bình luận chỉ ra, có những lib có thể giúp quản lý bảo mật mật khẩu.
omniauth
(đường ray) hoặc pythonsocial-auth
. Người dùng PHP (và các ngôn ngữ máy chủ web phổ biến khác) cũng nên thoải mái thêm tương đương.