了解护照序列化反序列化

你如何向外行解释Passport序列化和反序列化方法的工作stream程?

  1. passport.serializeUser被调用后, user.id去哪里?

  2. 我们正在调用passport.deserializeUser之后它在哪里适合工作stream?

     // used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user.id); // where is this user.id going? Are we supposed to access this anywhere? }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); 

我仍然试图把我的头围绕着它。 我有一个完整的工作应用程序,并没有遇到任何forms的错误。

我只是想了解这里究竟发生了什么?

任何帮助表示赞赏。

  1. 在passport.serializeUser被调用之后,user.id去哪里?

用户ID(作为done函数的第二个参数提供)保存在会话中,稍后用于通过deserializeUser函数检索整个对象。

serializeUser决定用户对象的哪些数据应该存储在会话中。 serializeUser方法的结果作为req.session.passport.user = {}连接到会话。 在这里,例如,它会(因为我们提供的用户ID作为关键) req.session.passport.user = {id:'xyz'}

  1. 我们正在调用passport.deserializeUser之后它在哪里适合工作stream?

deserializeUser的第一个参数对应于赋给done函数的用户对象的键(参见1.)。 所以你的整个对象是借助这个键来检索的。 这里的关键是用户ID(密钥可以是用户对象的任何键,例如名字,电子邮件等)。 在deserializeUser ,该键与内存数组/数据库或任何数据资源相匹配。

获取的对象作为req.user附加到请求对象

可视化stream程

 passport.serializeUser(function(user, done) { done(null, user.id); | }); | | |____________________> saved to session req.session.passport.user = {id:'..'} | passport.deserializeUser(function(id, done) { ________________| | User.findById(id, function(err, user) { done(err, user); |______________>user object attaches to the request as req.user }); }); 

对于任何使用Koa和koa护照的人 :

要知道在serializeUser方法中设置的用户密钥(通常是该用户的唯一ID)将被存储在:

this.session.passport.user

当您在done(null, user)设置done(null, user) ,其中“user”是数据库中的某个用户对象:

this.req.userthis.passport.user

由于某些原因,当您在this.user调用done(null,user)时, this.user Koa上下文永远不会被设置。

所以你可以在调用app.use(passport.session())之后编写自己的中间件,把它放在this.user中,如下所示:

 app.use(function * setUserInContext (next) { this.user = this.req.user yield next }) 

如果你不清楚如何serializeUser和反序列化用户的工作,只需打开我的twitter。 @yvanscher