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

bom*_*ant 14 authentication mongoose node.js express 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);
       });
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

Console.log经常与文本一起输出(即使在单个API请求中)

DESER

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

Nar*_*oni 25

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

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

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

在您编写的代码中,只有用户ID被序列化到会话中.收到后续请求时,将使用此ID查找将要还原到的用户req.user.

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

  • 感谢您的回复,我知道您写的关于`_id`的内容我只是认为在护照文档中很奇怪,在教程中他们大多使用`user.id`并且文档中没有`id`字段.你明白为什么我觉得这很奇怪吗?并且暗示不是使用`user.id`而是使用`done(null,**user**);`只是用户?或者如果有名称字段,可能是`user.name`. (5认同)
  • `user.id`来自哪里?在大多数猫鼬模型中,我看到用户有以下字段:`_ id`,`name`,`password`等.字母是`id`arbitrary.我可以使用`done(null,user.cat);`? (2认同)
  • _serialiseUser(function(user, done) { ... })_ 中的 _user_ 来自哪里? (2认同)

Sun*_*arg 7

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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

这是解释它流动性很好的文章

  • @SurajJain,仅在身份验证时才会调用 serializeUser,对于下一个请求,会调用 deserializeUser。 (2认同)