Паспорт вызывает deserializeUser для каждого запроса с NextJs и Express - PullRequest
0 голосов
/ 23 сентября 2019

Я реализую простой вход в систему для моего приложения узла с помощью Passport Local, Express, Next.js и хранилища MongoSession.

Все работает хорошо, за исключением того, что мое приложение запускает deserializeUser для каждого отдельного запроса.Это приводит к тому, что моя база данных получает более 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;

1 Ответ

0 голосов
/ 27 сентября 2019

Этот код, похоже, решил проблему.Спасибо Тиме за Builderbook!

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

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

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