什么是序列化和反序列化护照方法?它到底设定了什么?

时间:2015-02-24 08:35:55

标签: node.js authentication express mongoose passport.js

我们有两种类型的用户,管理员和普通用户。

passport.serializeUser(function(user, done) {
  console.log('Sear');
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  console.log(id);
  console.log("Deser");
  User.findById(id, function(err, user) {
    if(err) done(err);
    if(user){
      done(null, user);  
    }else{
       vendorUser.findById(id, function(err, user){
        if(err) done(err);
        done(null,user);
       });
    }
  });
});

Console.log经常使用文本

输出(即使在单个API请求中)
  

DESER

这两个功能究竟做了什么?详细的答案表示赞赏。 TIA。

2 个答案:

答案 0 :(得分:23)

序列化和反序列化是重要的概念。 序列化对象意味着将其状态转换为字节流,以便字节流可以还原为对象的副本。

在典型的Web应用程序中,用于对用户进行身份验证的凭据只会在登录请求期间传输。如果身份验证成功,将通过用户浏览器中设置的cookie建立和维护会话。

每个后续请求都不包含凭据,而是包含标识会话的唯一cookie。 为了支持登录会话,Passport将对会话进行序列化和反序列化用户实例。

在您编写的代码中,只有用户ID被序列化到会话中。收到后续请求时,此ID用于查找用户,该用户将恢复为req.user

为了让开发人员可以自由地使用他们想要的任何数据库,无论他们想要序列化什么数据,他们都可以以自己的方式完成,序列化和反序列化逻辑留待我们实施。

答案 1 :(得分:6)

serializeUser是在登录请求上调用的方法(在身份验证期间),如果登录成功,则它决定应该在会话中存储哪些用户信息,并将cookie发送到浏览器以进行同样是为了维持会议。

// Only during the authentication to specify what user information should be stored in the session.
passport.serializeUser(function (user, done) {
    console.log("Serializer : ", user)
    done(null, user.id);
});

上面的代码段会将user.id字段保存到会话和Cookie中。

deserializeUser是在所有后续请求中调用的方法,由passport.session中间件调用。它使我们能够在每个请求上加载其他用户信息。此用户对象作为req.user附加到请求,使其可以在我们的请求处理中访问。

Here is解释它的文章流程非常好