首页 > 解决方案 > PassportJs req.authenticated 总是返回 false

问题描述

我正在将passportJS与节点快递应用程序一起使用。我创建了 3 条路线:

  1. /登录
  2. /登记
  3. /认证

现在,当用户登录成功时,req.Authenticated() 为真,但是当我导航到前端的不同路由时,这是一个反应应用程序。我得到 req.Authenticated() 错误。我正在使用基于passportjs会话的身份验证。我已经实现了 /auth 路由,因为我想从服务器端发送 isLoggedIn 字段,如果它为真,那么我将用户导航到 react-router 中的私有路由,如果 isLoggedIn 为假,则用户无权查看该网页。我在网上查看了很多资源,但没有一个有效。

护照-config.js

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const User = require("./models/user");
const bcrypt = require("bcrypt");

passport.use(
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
    },
    async (email, password, done) => {
      try {
        const user = await User.findOne({ email });
 
        if (!user) {
          return done(null, false, {
            message: "Username/email not registered",
          });
        }
        const temp = await bcrypt.compare(password, user.password);

        try {
          if (await bcrypt.compare(password, user.password)) {
            return done(null, user);
          } else {
            console.log("Inside else");
            return done(null, false, { message: "Password incorrect" });
          }
        } catch (e) {
          return done(e);
        }
      } catch (error) {
        done(error);
      }
    }
  )
);

passport.serializeUser(function (user, done) {
  // console.log("serializeUser id", user.id);
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  // console.log("deserializeUser", id);
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

用户.js:

router.post("/login", passport.authenticate("local"), async (req, res) => {
  console.log("Login route");
  const { email, password } = req.body;
  const user = await User.findOne({ email });
  if (!user) {
    return res.status(409).json({
      message: "User doesn't exist",
    });
  }
  bcrypt.compare(password, user.password, (err, result) => {
    if (err) {
      return res.status(401).json({
        message: "Auth failed",
      });
    }
    if (result) {
      console.log("result login", result);
      return res.status(200).json({
        userId: user._id,
        message: "Login successful",
      });
    }
    return res.status(401).json({
      message: "Auth failed",
    });
  });
});

router.post("/register", async (req, res) => {
  try {
    const { email, password, type, firstName, lastName } = req.body;
    const doesExist = await User.findOne({ email });
    if (doesExist) {
      return res.status(409).json({
        message: "Email exists",
      });
    }

    bcrypt.hash(password, 10, (err, hash) => {
      if (err) {
        return res.status(500).json({
          error: err,
        });
      } else {
        const newUser = new User({
          email: email,
          password: hash,
          type: type,
          firstName: firstName,
          lastName: lastName,
        });
        newUser
          .save()
          .then((user) => {
            console.log(user);
            res.status(201).json({
              message: "User created",
            });
          })
          .catch((err) => {
            console.log(err);
            res.status(500).json({
              error: err,
            });
          });
      }
    });
  } catch (error) {
    console.log("error", error);
  }
});

router.get("/auth", async (req, res) => {
  if (req.isAuthenticated()) {
    res.status(200).json({ isLoggedIn: true });
  } else {
    res
      .status(401)
      .json({ msg: "You are not authorized to view this resource" });
  }
});

server.js 文件:https ://pastebin.com/JmxQCeGS

标签: javascriptnode.jsexpresspassport.js

解决方案


推荐阅读