Hỏi về đăng nhập bằng ajax nodejs?
-
Mình đang sử dụng passportJs và json web token sau khi đăng nhập xong server sẽ trả về 1 token và lưu ở localstore khi mà lần sau đăng nhập thì sẽ lấy token từ localstore gửi ajax lên server rồi server sẽ lữu vào session passportJs là đã đăng nhập nhưng khi mình thử thì f5 vài lần thì nó mới tự đăng nhập được. Giá trị trên server mình xem log thì passport đã có user.
exports.checkLoginAxios = (req, res, callback) => { var token = req.body.token; if (req.session.token || token) { if (!req.session.token) { req.session.token = token; } else token = req.session.token; jwt.verify(req.session.token, config.secret, function (err, decoded) { if (err) { return res.send(false); } else { decoded = decoded.data; // console.log(req.session) log phía trên return res.json({ ten: decoded.ten, quyen_hang: decoded.quyen_hang, _id: decoded._id, avatar:decoded.anh_dai_dien, token: token }) } }); } else return res.send(false); }
Sau khi gửi ajax để đăng nhập thì mình thử một thao tác yêu cầu phải đăng nhập mới được thực hiện và router và hàm kiểm tra đăng nhập của mình. Khoản 3 - 4 lần f5 đầu tiên sau khi mình khởi động lại node đều trả về là "Chưa Đăng Nhập" còn những lần sau thì nó mới cho thông qua.
router.post('/comment/UpOrDown', kiem_tra_dang_nhap, jsonParser, C_Comment.upOrDown); function kiem_tra_dang_nhap(req, res, next) { if (req.isAuthenticated()) { return next(); } else { return res.json({error: "Chưa đăng nhập"}); } }
-
@Kha-Pham Bạn log cái này ở đoạn đầu hàm check xem:
console.log(req.session.token, req.body.token, req.body.token == req.session.token)
Với mình có mấy chỗ hơi khó hiểu:
lấy token từ body -> kiểm tra sesion có không. Ưu tiên token trong session nếu có.
Vậy thì bạn 1 là lưu token trong session luôn. Còn trả về thì chả cần lưu làm gì. Vì token fake thì sao validate đúng được.
Nếu token bạn trả về rồi. Thì cách của bạn đang là stateless mà đúng k. Vậy thì hàm verify của bạn chỉ cần gọi jwt hay passport để validate đúng token từ req.body hay header token thôi.Mình nghĩ nếu được bạn thửu flow này xem:
Step1 : Login/register -> success return jwt token + info user Step 2: Đinh token vào req.header.authorization --> server get token from header -> validate = jwt -> Nếu sai throw hoạce return , nếu đúng -> get payload take user_id -> query db xem có user nào có id này ko -> sai return, đúng -> req.user = user (coi req như 1 context chứa) -> next(),
-
console.log(req.session.token, req.body.token, req.body.token == req.session.token)
Mình không có check 2 cái token đó bằng nhau như vậy.
Đầu tiên là gửi token lên server => kiểm tra token có trong session chưa nếu chưa thì gán token từ client vào session => tiếp theo check token có hộp lệ hay không => nếu hộp lệ trả về thông tin user lưu trong token cho passport -
Ví dụ lần đầu tiên sau khi khởi động node lên thì không đăng nhập đc. F5 khoản vài lần thì nó mới nhận trạng thái đăng nhập.
-
Khi lưu session vào database bằng connect-mongo thì không cò bị lỗi nữa.
-
@Kha-Pham Mấy cái này thì chịu. Với nữa là bạn có cluster app k ?
-
@Nguyen-Hien không bạn. mình chỉ chạy và lập trình trên 1 máy laptop thôi. Với lại củng chưa tìm hiểu về cluster nữa