โดยพื้นฐานแล้วฉันกำลังมองหาสิ่งเดียวกัน โดยเฉพาะฉันต้องการสิ่งต่อไปนี้:
- หากต้องการใช้ 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("/");
}
});
});
อย่างไรก็ตามวิธีการนี้ส่วนใหญ่ได้รับการออกแบบให้มีความยืดหยุ่นและเรียบง่าย ฉันแน่ใจว่ามีวิธีมากมายในการปรับปรุง หากคุณมีฉันต้องการความคิดเห็นของคุณ
แก้ไข: นี่คือตัวอย่างที่ง่าย ในระบบที่ใช้งานจริงคุณไม่ต้องการจัดเก็บและเปรียบเทียบรหัสผ่านเป็นข้อความธรรมดา ในฐานะที่เป็นผู้แสดงความคิดเห็นชี้ให้เห็นว่ามี libs ที่สามารถช่วยจัดการความปลอดภัยของรหัสผ่าน
omniauth
(ราง)social-auth
หรืองูหลาม ผู้ใช้ PHP (และภาษาเว็บเซิร์ฟเวอร์ทั่วไปอื่น ๆ ) ผู้ใช้ควรเพิ่มสิ่งที่เทียบเท่าได้เช่นกัน