2016-02-12 19 views
13

Tôi đang sử dụng nút/Express với hộ chiếu trong quá trình phát triển của mình. Tôi đã xem một bài viết có nội dung:Làm thế nào để js hộ chiếu lưu trữ đối tượng người dùng trong phiên?

Tải nhanh dữ liệu phiên và đính kèm dữ liệu đó vào req. Khi hộ chiếu lưu trữ người dùng được tuần tự hóa trong phiên, đối tượng người dùng được tuần tự hóa có thể được tìm thấy tại req.session.passport.user.

Nhưng với sự ngạc nhiên của tôi, giá trị cho sessionID lưu trữ trong cookie của trình duyệt vẫn giữ nguyên trước và sau khi đăng nhập. Vậy đối tượng người dùng được tuần tự hóa được lưu trữ ở đâu?

tôi nghĩ rằng nó đã được lưu trữ trong người dùng sessionid Cookie ban đầu nhưng có vẻ như đây không phải là trường hợp như tôi vẫn có thể truy cập vào đối tượng người dùng của tôi với req.session.passport.user

Trả lời

19

Vậy đối tượng người dùng được tuần tự hóa được lưu trữ ở đâu?

Trong ngắn

Đối tượng sử dụng tuần tự được lưu trữ trong req.user bởi PassportJS lấy từ req.session.passport.user (được được phổ biến bởi Express) với sự giúp đỡ của Passport'sdeserializeUser phương pháp.

Express thêm id của đối tượng phiên vào cookie trên trình duyệt của người dùng, được gửi lại để thể hiện trong tiêu đề theo mọi yêu cầu. Express sau đó lấy id từ tiêu đề và tìm kiếm cửa hàng phiên (ví dụ: Mongo hoặc bất kỳ thứ gì) và tìm mục nhập và tải nó đến req.session.

PassportJS sử dụng nội dung của req.session để theo dõi người dùng xác thực với sự giúp đỡ của serializeUserdeserializeUser phương pháp (để biết thêm thông tin về công việc của serializeUserdeserializeUser xem câu trả lời của tôi trong này SO question).

Express chịu trách nhiệm tạo phiên. khi nào các phiên được tạo? Đó là khi Express không phát hiện cookie phiên. Vì vậy, thứ tự mà bạn sắp xếp các cấu hình sessionpassport trong tệp app hoặc server.js của bạn là rất quan trọng. Nếu bạn khai báo các cấu hình sessionpassport ở trên static directory configs thì tất cả các yêu cầu cho static content cũng sẽ nhận được một phiên, điều này không tốt.

Hãy xem câu trả lời của tôi cho SO question, nơi tôi đã đề cập đến quyền truy cập nội dung tĩnh cũng như cách áp dụng có chọn lọc passport cho các tuyến nhất định chứ không phải mặc định (bạn có thể không cần phải xác thực tất cả tuyến đường). không cần thiết session store lookupde-serialization bằng cách chỉ đính kèm phiên vào các yêu cầu ánh xạ tới URL an toàn xem bên dưới).

//selectively applying passport to only secure urls 
app.use(function(req, res, next){ 
    if(req.url.match('/xxxx/secure')) 
    passport.session()(req, res, next) 
    else 
    next(); // do not invoke passport 
}); 

Có một tuyệt vời tutorial mà tôi khuyên bạn nên đọc nếu bạn muốn hiểu quy trình làm việc của PassportJS.

0

Bạn có thể ghé qua sessionID trong cookie như một khóa đến cơ sở dữ liệu nơi dữ liệu phiên được lưu trữ. Tùy thuộc vào trình xử lý phiên bạn sử dụng với express và chính sách lưu trữ nào bạn sử dụng dữ liệu sẽ được lưu trữ theo nhiều cách khác nhau. Điều này có nghĩa là sessionID có thể có cùng giá trị cả trước khi đăng nhập, sau khi đăng nhập thành công và thậm chí sau khi người dùng đăng xuất.

Nếu bạn sử dụng express-session với MemoryStore dữ liệu sẽ được lưu trong bộ nhớ của quá trình nút, được lập chỉ mục trên sessionID. Nhìn ở đây để xem initialization của cửa hàng và tại đây cho storing dữ liệu.

Bạn có thể tạo cửa hàng nơi dữ liệu được đăng trên cookie, nhưng không có dữ liệu nào được liệt kê trong compatible session stores.

Các vấn đề liên quan