Saya pada dasarnya mencari hal yang sama. Secara khusus, saya menginginkan yang berikut:
- Untuk menggunakan express.js, yang membungkus kemampuan middleware Connect
- Otentikasi "Berbasis formulir"
- Kontrol granular atas rute mana yang diautentikasi
- Database back-end untuk pengguna / kata sandi
- Gunakan sesi
Apa yang akhirnya saya lakukan adalah membuat fungsi middleware saya sendiri check_auth
yang saya sampaikan sebagai argumen untuk setiap rute yang ingin saya otentikasi. check_auth
hanya memeriksa sesi dan jika pengguna tidak masuk, maka arahkan mereka ke halaman login, seperti:
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();
}
Lalu untuk setiap rute, saya memastikan fungsi ini dilewatkan sebagai middleware. Sebagai contoh:
app.get('/tasks', check_auth, function(req, res) {
// snip
});
Akhirnya, kita harus benar-benar menangani proses login. Ini mudah:
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("/");
}
});
});
Bagaimanapun, pendekatan ini sebagian besar dirancang agar fleksibel dan sederhana. Saya yakin ada banyak cara untuk memperbaikinya. Jika Anda punya, saya sangat ingin umpan balik Anda.
EDIT: Ini adalah contoh yang disederhanakan. Dalam sistem produksi, Anda tidak akan pernah ingin menyimpan & membandingkan kata sandi dalam teks biasa. Sebagai komentator tunjukkan, ada lib yang dapat membantu mengelola keamanan kata sandi.
omniauth
(rails) atau pythonsocial-auth
. Pengguna PHP (dan bahasa server web umum lainnya) juga harus merasa bebas untuk menambahkan padanannya.