Passport.deserializeUser () не вызывается, а req.user не определен - PullRequest
0 голосов
/ 19 июня 2020

Хорошо, я ломаю голову над этим уже несколько часов. Когда я вызываю свой маршрут входа в систему, промежуточное ПО для паспорта работает нормально и возвращает объект req.user, но когда я вызываю другой маршрут после этого, req.user для этого другого маршрута не определено. Где именно я здесь напортачил? Я не уверен, что это важно, но я вызываю свои маршруты API из клиента реакции.

аутентификация

router.post(
  "/sign-in",
  passport.authenticate("local"),
  async (req, res, next) => {
    if (!req.user) console.log("NO USER!*******************");
    try {
      const user = _.get(req, "user", "");

      res.status(200).json(user);
    } catch (e) {
      console.log({ e });
      return res.status(400).json(false);
    }
  }
); 

Мой сервер

app.use(cors());
app.use(cookieparser());
app.use(logger("dev"));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(
  session({
    secret: "super",
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false, maxAge: 4 * 60 * 60 * 1000 }
  })
);
require("./utils/passport");

app.use(passport.initialize());
app.use(passport.session());

. / Utils / паспорт

const _ = require("lodash");
const LocalStrategy = require("passport-local").Strategy;

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
const bcrypt = require("bcrypt");

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(async function(id, done) {
  console.log("");
  console.log("deserializeUser*************************");
  console.log("");

  try {
    const user = await prisma.user.findOne({ where: { id } });
    if (!user) {
      return done(null, false);
    }

    return done(null, user);
  } catch (e) {
    done(e);
  }
});

passport.use(
  new LocalStrategy(
    {
      passReqToCallback: true,
      usernameField: "email"
    },

    async (req, email, password, done) => {
      try {
        const user = await prisma.user.findOne({ where: { email } });
        if (!user) {
          return done(null, false);
        }

        await bcrypt.compare(
          password,
          _.get(user, "password", ""),
          (err, result) => {
            if (!result) {
              done(null, false);
            }
            done(null, user);
          }
        );
      } catch (e) {
        done(e);
      }
    }
  )
);

1 Ответ

0 голосов
/ 20 июня 2020

Я подозреваю, что что-то не так с частью, где у вас есть метод отправки с аутентификацией паспорта. Эта часть может быть удалена:

if (!req.user) console.log("NO USER!*******************");

Я думаю, что асинхронность может дать здесь странные результаты. Затем для устранения неполадок включите в свои

  const user = _.get(req, "user", "");

реальные данные, например реальные данные пользователя. Таким образом, вы сможете убедиться, что данные проходят.

...