Tôi đang cố gắng thiết lập cơ chế đăng nhập bằng node.js, express và passport.js. Bản thân Đăng nhập hoạt động khá tốt, các phiên cũng được lưu trữ độc đáo với redis nhưng tôi gặp một số rắc rối với việc chuyển hướng người dùng đến nơi anh ta bắt đầu trước khi được nhắc xác thực.
Ví dụ: người dùng theo liên kết http://localhost:3000/hidden
sau đó được chuyển hướng đến http://localhost:3000/login
nhưng sau đó tôi muốn anh ta được chuyển hướng trở lại http://localhost:3000/hidden
.
Mục đích của việc này là, nếu người dùng truy cập ngẫu nhiên một trang mà anh ta cần đăng nhập trước, anh ta sẽ được chuyển hướng đến trang / đăng nhập cung cấp thông tin đăng nhập của mình và sau đó được chuyển hướng trở lại trang mà anh ta đã cố gắng truy cập trước đó.
Đây là bài đăng nhập của tôi
app.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) {
return next(err)
} else if (!user) {
console.log('message: ' + info.message);
return res.redirect('/login')
} else {
req.logIn(user, function (err) {
if (err) {
return next(err);
}
return next(); // <-? Is this line right?
});
}
})(req, res, next);
});
và đây là phương pháp ensureAuthenticated của tôi
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
cái nào kết nối vào /hidden
trang
app.get('/hidden', ensureAuthenticated, function(req, res){
res.render('hidden', { title: 'hidden page' });
});
Đầu ra html cho trang đăng nhập khá đơn giản
<form method="post" action="/login">
<div id="username">
<label>Username:</label>
<input type="text" value="bob" name="username">
</div>
<div id="password">
<label>Password:</label>
<input type="password" value="secret" name="password">
</div>
<div id="info"></div>
<div id="submit">
<input type="submit" value="submit">
</div>
</form>