Nếu bạn đang sử dụng phiên bạn phải cung cấp hộ chiếu có chức năng serialize và deserialize. Việc triển khai Redis như một cửa hàng phiên không liên quan gì đến cách triển khai hộ chiếu, nó chỉ giải quyết nơi dữ liệu phiên được lưu trữ.
Triển khai Phiên với hộ chiếu
Như tôi đã nói, các chức năng serialize và deserialize phải được cung cấp cho hộ chiếu để các phiên hoạt động.
Mục đích của tuần tự hóa chức năng là trả lại đầy đủ thông tin nhận dạng để khôi phục tài khoản người dùng trong bất kỳ yêu cầu tiếp theo nào. Cụ thể là tham số thứ hai của done()
phương thức là thông tin được tuần tự hóa thành dữ liệu phiên .
deserialize chức năng mà bạn cung cấp nhằm mục đích trả lại hồ sơ người dùng dựa trên thông tin nhận dạng đã được tuần tự hóa cho phiên .
Đây là ví dụ từ Hướng dẫn Hộ chiếu trong phần thảo luận về các phiên họp:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Trong ví dụ trên passport.serializeUser()
được cung cấp một hàm có hai tham số, hồ sơ người dùng (user
) và một hàm gọi lại (done
). Hàm gọi lại coi thông số nhận dạng là thông số thứ hai (user.id
, nhưng nếu bạn đang sử dụng mongoDB thì đây có thể là user._id
) cần thiết để khôi phục tài khoản từ cơ sở dữ liệu. Điều này sẽ được gọi theo mọi yêu cầu đã xác thực và lưu trữ thông tin nhận dạng trong dữ liệu phiên (cho dù đó là trong cookie hay cửa hàng Redis của bạn).
passport.deserializeUser()
được cung cấp một hàm cũng nhận hai tham số, thông tin nhận dạng (id
) và một chức năng gọi lại (done
). Thông tin nhận dạng là thông tin đã được tuần tự hóa thành dữ liệu phiên trong yêu cầu trước đó (user.id
). Hàm gọi lại ở đây yêu cầu cấu hình người dùng làm tham số thứ hai hoặc bất kỳ lỗi nào được nêu ra trong việc truy xuất cấu hình dưới dạng tham số đầu tiên. User.findById()
function là một chức năng tra cứu hồ sơ người dùng trong cơ sở dữ liệu. Trong ví dụ này User
đối tượng là một phiên bản của mô hình mongoose có findById()
chức năng.
Hàm được cung cấp cho passport.deserializeUser()
được gọi bởi phần mềm trung gian hộ chiếu, passport.session()
trước khi xử lý tuyến đường để lưu trữ hồ sơ người dùng (user
) đến req.user
.
Triển khai Redis dưới dạng một Session Store
Mục đích của việc sử dụng Redis là lưu trữ phía máy chủ dữ liệu phiên, do đó, dữ liệu duy nhất được lưu trữ phía máy khách là id phiên. Một lần nữa, điều này độc lập với cách bạn đã triển khai hộ chiếu, hộ chiếu không quan tâm nơi dữ liệu phiên đang được lưu trữ miễn là bạn đã thêm hỗ trợ phiên vào ứng dụng của mình. Câu hỏi previos về stackoverflow này giải quyết cách triển khai Redis