了解护照序列化反序列化

您如何向外行解释Passport的序列化和反序列化方法的工作流程。


叫到哪里user.id去passport.serializeUser了?


我们passport.deserializeUser紧接着在工作流程中调用它吗?


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

    });

});

我仍在努力寻找解决方案。我有一个完整的工作应用程序,没有遇到任何类型的错误。


我只是想了解这里到底发生了什么?


任何帮助表示赞赏。


慕姐4208626
浏览 1227回答 3
3回答

慕侠2389804

对于使用Koa和koa-passport的任何人:知道在serializeUser方法中设置的用户密钥(通常是该用户的唯一ID)将存储在:this.session.passport.user当done(null, user)在deserializeUser中设置时,“ user”是数据库中的某些用户对象:this.req.user 要么 this.passport.user由于某种原因,this.user当您在deserializeUser方法中调用done(null,user)时,永远不会设置Koa上下文。因此,您可以在调用app.use(passport.session())之后将自己的中间件放入this.user中,如下所示:app.use(function * setUserInContext (next) {  this.user = this.req.user  yield next})如果您不清楚serializeUser和deserializeUser如何工作,请在Twitter上打我。

慕少森

您可以将整个用户对象放入会话数据中,但这通常不是一个好主意,因为它可能会有其他副作用。例如,当用户更新他/她的用户名时,您也必须更新会话数据,否则,由于“重命名功能损坏”,您将获得票证。那是一个相对无害的例子。权限位或相等的敏感数据也可能发生同样的事情(糟糕...)。本质上,如果您有重复的数据,通常会遇到相同的问题。TL; DR-不要这样做。
打开App,查看更多内容
随时随地看视频慕课网APP