求助,egg-passport-local中没有调用deserializeUser
发布于 5 年前 作者 Robinsir 2556 次浏览 来自 问答

小白刚学egg,想完成本地持久化登陆: 用户名密码登陆 :登陆请求 -> 校验用户名密码(通过)->把用户_id 加密写入cookies->登陆成功 利用session登陆:获取资源请求->从cookies中获取用户_id(如果有),解密,验证(通过)->验证成功 以上我理解session登陆过程,使用egg-passport-local来完成

/app.js

'use strict';
module.exports = app => {
  app.passport.verify(async (ctx, user) => {
    console.log('verify');
    console.log(user);
    return user;
  });

  // 将用户信息序列化后存进 session 里面,一般需要精简,只保存个别字段
  app.passport.serializeUser(async (ctx, user) => {
    console.log('serializeUser');
  });

  // 反序列化后把用户信息从 session 中取出来,反查数据库拿到完整信息
  app.passport.deserializeUser(async (ctx, user) => {
    console.log('deserializeUser');
  });

}; 

/app/router.js

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);

  const localStrategy = app.passport.authenticate('local');
  router.post('/login', localStrategy);
};

=========

/app/controller/home.js

 	 async index() {
    if (await this.ctx.isAuthenticated()) {
      this.ctx.body = 'hi, egg';
    } else {
      this.ctx.body = 'not Authenticated !';
    }
  }

用户名密码登陆是成功的,登陆完毕后调用serializeUser, 但是想请求需要登陆资源,为什么没有调用deserializeUser 还是我流程弄错?Stackoverflow同类问题 另外为什么egg-passport-local issues区被关闭了

1 回复

已解决,这里有个TypeScript example,经过测试, serializeUser/deserializeUser需要return 参数,不return 不会打印console 貌似是基础的东西,有大佬解释下原理吗?

回到顶部