【问题标题】:passport.deserializeUser() not being called and req.user is undefinedpassport.deserializeUser() 未被调用且 req.user 未定义
【发布时间】:2020-06-20 20:58:21
【问题描述】:

好的,我已经为此绞尽脑汁好几个小时了。当我调用我的“登录”路由时,护照中间件工作正常并返回 req.user obj,但是当我之后调用另一条路由时,该另一条路由的 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/passport

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

【问题讨论】:

    标签: node.js reactjs passport.js


    【解决方案1】:

    我怀疑您使用护照身份验证的邮寄方法的部分有问题。 这部分可能会被删除:

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

    我认为异步可能会在这里产生奇怪的结果。然后为了排除故障,包括在你的

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

    真实数据,例如真实的用户数据。因此,您将能够验证数据是否正在通过。

    【讨论】:

    • 感谢您的回复,但从未调用过“NO USER”控制台日志,因为登录始终返回 req.user。但是,每当我在找不到 req.user 之后进行另一个 API 调用时,我认为这是因为没有调用 deserializeUser。我最终切换到 JWT,因为我实在想不通。
    猜你喜欢
    • 2018-02-23
    • 2021-03-30
    • 2021-04-22
    • 2015-07-18
    • 2021-12-27
    • 2016-04-01
    • 1970-01-01
    • 2018-08-06
    • 2017-06-13
    相关资源
    最近更新 更多