req.isAuthenticated() 总是返回 false 并且 req.session.passport 未定义

发布于 2025-01-14 01:26:26 字数 3688 浏览 2 评论 0原文

我知道已经有一些这样的问题,但我已经尝试了每一个响应,但没有任何效果,我不知道到底要添加到 app.js 中以使其工作并存储会话。

这是我的 app.js:

const express = require("express");
const cors = require("cors");
const usersRouter = require("./routes/users");
const passport = require("passport");
const cookieParser = require("cookie-parser");
const session = require("express-session");
require("dotenv").config();

const app = express();

const connectDB = require("./db/connect");

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser(process.env.SESSION_SECRET));
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    cookie: { secure: false },
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.use(cors());

app.use("/api/v1/users", usersRouter);

const PORT = process.env.PORT || 5000;

const start = async () => {
  try {
    await connectDB(process.env.MONGO_URI);
    app.listen(PORT, console.log(`Server is listening on port: ${PORT}....`));
  } catch (error) {
    console.log(error);
  }
};

const notFound = require("./middleware/notFound");
app.use(notFound);

start();

我的护照配置如下所示:

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

const initialize = (passport) => {
  const authenticateUser = async (email, password, done) => {
    let user = await User.findOne({ email: email });
    User.findOne({ email: email });
    if (!user) {
      return done(null, false, {
        message: "That email is not registered",
      });
    }
    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user, { message: "User logged in" });
      } else {
        return done(null, false, { message: "Password incorrect" });
      }
    } catch (e) {
      return done(e);
    }
  };
  passport.use(new localStrategy({ usernameField: "email" }, authenticateUser));
  passport.serializeUser(function (user, done) {
    done(null, user.id);
  });

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

module.exports = initialize;

我的用户路由器如下所示:

const express = require("express");
const router = express.Router();
const passport = require("passport");

const initializePassport = require("../config/passport-config");
initializePassport(passport);

const { postRegister } = require("../controllers/register");
router.route("/register").post(postRegister);

router.post("/login", function (req, res, next) {
  passport.authenticate("local", function (err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({ message: info.message });
    }
    console.log(req.session.passport);
    res.status(200).json(user);
  })(req, res, next);
});

module.exports = router;

我正在制作一个中间件,根据是否经过身份验证来授权或不授权对另一个端点的调用't。

该中间件的外观如下:

const checkAuthenticated = (req, res, next) => {
  const isAuthenticated = req.isAuthenticated();
  console.log(req.session.passport);
  if (isAuthenticated) {
    next();
  }
  next();
};

module.exports = checkAuthenticated;
const checkNotAuthenticated = (req, res, next) => {
  const isAuthenticated = req.isAuthenticated();
  if (!isAuthenticated) {
    res
      .status(401)
      .json({ msg: "Not allowed to this path without credentials" });
  }
};

module.exports = checkNotAuthenticated;

req.session.passport 未定义, isAuthenticated() 始终为 false,我不知道要添加什么。

I know that there are some questions like this already, but i already tried every single response and nothing works, i don't know what the heck to add to app.js to make it work and store the sessions.

Here is my app.js:

const express = require("express");
const cors = require("cors");
const usersRouter = require("./routes/users");
const passport = require("passport");
const cookieParser = require("cookie-parser");
const session = require("express-session");
require("dotenv").config();

const app = express();

const connectDB = require("./db/connect");

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser(process.env.SESSION_SECRET));
app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    cookie: { secure: false },
  })
);
app.use(passport.initialize());
app.use(passport.session());

app.use(cors());

app.use("/api/v1/users", usersRouter);

const PORT = process.env.PORT || 5000;

const start = async () => {
  try {
    await connectDB(process.env.MONGO_URI);
    app.listen(PORT, console.log(`Server is listening on port: ${PORT}....`));
  } catch (error) {
    console.log(error);
  }
};

const notFound = require("./middleware/notFound");
app.use(notFound);

start();

My passport-config looks like this:

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

const initialize = (passport) => {
  const authenticateUser = async (email, password, done) => {
    let user = await User.findOne({ email: email });
    User.findOne({ email: email });
    if (!user) {
      return done(null, false, {
        message: "That email is not registered",
      });
    }
    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user, { message: "User logged in" });
      } else {
        return done(null, false, { message: "Password incorrect" });
      }
    } catch (e) {
      return done(e);
    }
  };
  passport.use(new localStrategy({ usernameField: "email" }, authenticateUser));
  passport.serializeUser(function (user, done) {
    done(null, user.id);
  });

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

module.exports = initialize;

And my users router looks like this:

const express = require("express");
const router = express.Router();
const passport = require("passport");

const initializePassport = require("../config/passport-config");
initializePassport(passport);

const { postRegister } = require("../controllers/register");
router.route("/register").post(postRegister);

router.post("/login", function (req, res, next) {
  passport.authenticate("local", function (err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({ message: info.message });
    }
    console.log(req.session.passport);
    res.status(200).json(user);
  })(req, res, next);
});

module.exports = router;

I'm making a middleware to authorize or to not authorize the call to another endpoint based on if it is authenticated or if it isn't.

Here is how that middleware looks:

const checkAuthenticated = (req, res, next) => {
  const isAuthenticated = req.isAuthenticated();
  console.log(req.session.passport);
  if (isAuthenticated) {
    next();
  }
  next();
};

module.exports = checkAuthenticated;
const checkNotAuthenticated = (req, res, next) => {
  const isAuthenticated = req.isAuthenticated();
  if (!isAuthenticated) {
    res
      .status(401)
      .json({ msg: "Not allowed to this path without credentials" });
  }
};

module.exports = checkNotAuthenticated;

req.session.passport is undefined, isAuthenticated() is always false, i don't know what to add.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热风软妹 2025-01-21 01:26:26

反序列化器函数中的错误:

它将通过将反序列化器回调参数从 user 更改为 id 来工作,如下所示。

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

这对我来说是一个非常明显的错误,为了确保您没有遗漏任何其他内容,请检查几分钟前我在另一个线程上对此给出的冗长答案:https://github.com/jaredhanson/passport/issues/914#issuecomment-1241921637

祝你好运。

Your bug in the deserializer function:

It will work by changing your deserializer callback argument from user to id as shown below.

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

That was a very obvious bug to me, to be sure you are not missing any other thing, check the lengthy answer I gave to this on another thread a few minutes ago here: https://github.com/jaredhanson/passport/issues/914#issuecomment-1241921637

Good luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文