【问题标题】:Passport calls deserializeUser for every request with NextJs and ExpressPassport 使用 NextJs 和 Express 为每个请求调用 deserializeUser
【发布时间】:2020-01-23 23:25:23
【问题描述】:

我正在使用 Passport Local、Express、Next.js 和 MongoSession 商店为我的节点应用程序实现一个简单的登录。

一切正常,除了我的应用程序为每个请求运行反序列化用户。这会导致我的数据库在任何应用交互中被击中 10 次以上

根据这篇帖子https://github.com/jaredhanson/passport/issues/14#issuecomment-4863459 我知道我对静态资产的请求正在影响中间件堆栈。

大部分请求都是针对路径 /_next/static*

如上例所示,我已尝试实现 express.static,但未能成功。请帮我弄清楚如何避免在每个请求上调用 deserializeUser。

谢谢!

这是我的代码:

app.js

const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(async () => {
  const server = express();
  server.use(helmet());
  server.use(express.static(path.join(__dirname, '_next', 'static')));
  server.use(express.json());

  auth({ ROOT_URL, server });
  api(server);

  routesWithSlug({ server, app });
  sitemapAndRobots({ server });

  server.get('*', (req, res) => {
    const url = URL_MAP[req.path];
    if (url) {
      app.render(req, res, url);
    } else {
      handle(req, res);
    }
  });

  server.listen(port, (err) => {
    if (err) throw err;
    logger.info(`> Ready on ${ROOT_URL}`);
  });
});

module.exports = { app };

auth.js

function auth({ ROOT_URL, server }) {
  const dev = process.env.NODE_ENV !== 'production';


  const MongoStore = mongoSessionStore(session);

  const sess = {
    name: 'builderbook.sid',
    secret: process.env.sessSecret,
    store: new MongoStore({
      mongooseConnection: mongoose.connection,
      ttl: 14 * 24 * 60 * 60, // expires in 14 days
    }),
    resave: false,
    saveUninitialized: false,
    cookie: {
      httpOnly: true,
      maxAge: 14 * 24 * 60 * 60 * 1000, // expires in 14 days
    },
  };

  if (!dev) {
    server.set('trust proxy', 1);
    sess.cookie.secure = true;
  }

  server.use(session(sess));
  server.use(passport.initialize());
  server.use(passport.session());
  server.use(bodyParser.urlencoded({ extended: false }));

  passport.serializeUser((user, done) => {
    console.log('serializeUser');
    done(null, user.id);
  });

  passport.deserializeUser((id, done) => {
    console.log(`deserializeUser, id: ${id}`);
    User.findById(id, User.publicFields(), (err, user) => {
      done(err, user);
    });
  });

  const verifyLocal = async (req, email, password, done) => {
    console.log({ email, password, req });
    const { firstName, lastName } = req.body;
    try {
      // signInOrSign up the user to MongoDb
      const user = await User.signInOrSignUp({
        email,
        password,
        firstName,
        lastName,
      });
      console.log(user);

      if (!user) {
        return done(null, false);
      }

      if (!User.verifyPassword(email, password)) {
        return done(null, false);
      }
      return done(null, user);
    } catch (err) {
      console.log(err); // eslint-disable-line
      return done(err);
    }
  };


  passport.use(
    new LocalStrategy(
      {
        usernameField: 'email',
        passReqToCallback: true,
      },
      verifyLocal,
    ),
  );
}

module.exports = auth;

authroutes.js

router.post('/login', passport.authenticate('local', { failureRedirect: '/fail' }), (req, res) => {
  res.redirect('/');
});

router.get('/logout', (req, res) => {
  req.logout();
  res.redirect('/login');
});

module.exports = router;

【问题讨论】:

    标签: node.js express authentication passport.js next.js


    【解决方案1】:

    这段代码似乎解决了这个问题。感谢 Builderbook 的 Tima!

    https://github.com/builderbook/builderbook/issues/229

    server.get('/_next*', (req, res) => {
        handle(req, res);
      });
    
      server.get('/static/*', (req, res) => {
        handle(req, res);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多