了解护照序列化反序列化
你如何向外行解释Passport序列化和反序列化方法的工作stream程?
-
在
passport.serializeUser
被调用后,user.id
去哪里? -
我们正在调用
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的错误。
我只是想了解这里究竟发生了什么?
任何帮助表示赞赏。
- 在passport.serializeUser被调用之后,user.id去哪里?
用户ID(作为done
函数的第二个参数提供)保存在会话中,稍后用于通过deserializeUser
函数检索整个对象。
serializeUser
决定用户对象的哪些数据应该存储在会话中。 serializeUser方法的结果作为req.session.passport.user = {}
连接到会话。 在这里,例如,它会(因为我们提供的用户ID作为关键) req.session.passport.user = {id:'xyz'}
- 我们正在调用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.user
或this.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