提问者:小点点

了解passport序列化反序列化


如何向外行解释Passportserialize和deserialize方法的工作流。

> 在调用后的位置?br>

我们在它之后调用,它适合工作流的什么位置?

// 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);
    });
});

我还在努力想办法。我有一个完整的工作应用程序,并没有运行到任何类型的错误。

我只想知道这里到底发生了什么?

感谢任何帮助。


共2个答案

匿名用户

    被调用后在哪里?/li>

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

确定用户对象的哪些数据应该存储在会话中。serializeUser方法的结果作为附加到会话。例如,在这里,它应该是(因为我们提供了用户id作为密钥)

的第一个参数对应于赋予函数的user对象的键(参见1.)。所以您的整个对象都是在该键的帮助下检索的。这里的键是用户id(键可以是用户对象的任何键,例如名称,电子邮件等)。在中,该键与内存数组/数据库或任何数据资源匹配。

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

视觉流

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-Passport的任何人:

知道serializeUser方法中设置的用户键(通常是该用户的唯一id)将存储在:

当您在deserializeUser中设置(其中“user"是数据库中的某个用户对象)时:

由于某种原因,当您在deserializeUser方法中调用DoneNull,user)时,Koa上下文从未被设置。

所以您可以在调用app.use(Passport.Session())之后编写自己的中间件,将其放入this.user中,如下所示:

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

如果您不清楚serializeUser和deserializeUser是如何工作的,请在Twitter上与我联系。电子邮件:Yvanscher