isAuthenticated() 始终返回 true

问题描述 投票:0回答:1

我正在尝试使用 Passport,它对于注册和登录部分来说工作得非常好,但是当我关闭 Chrome/Edge 并返回时,我仍然能够查看受限页面。 isAuthenticated() 仅返回一次 false,然后始终返回 true。 我尝试过使用不同的浏览器(Chrome/Edge),结果是相同的。我不确定是否是因为浏览器的原因导致 cookie 没有被删除,或者我的代码是否有问题。 如果我自己清除cookies,那么它就可以工作,但我真的很感激对此的第二意见,只是想确保我的代码是正确的,或者如果我需要添加一些东西,以便cookies在我退出浏览器后删除自己。

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");

const app = express();

app.set("view engine", "ejs");
app.use(
  bodyParser.urlencoded({
    extended: true,
  })
);
app.use(express.static("public"));
app.use(
  session({
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: false,
  })
);
app.use(passport.initialize());
app.use(passport.session());

mongoose.connect(process.env.DB_ADDRESS);

const userSchema = mongoose.Schema({
  email: String,
  password: String,
});
userSchema.plugin(passportLocalMongoose);

const User = new mongoose.model("User", userSchema);

passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.get("/secrets", (req, res) => {
  if (req.isAuthenticated()) {
    res.render("secrets");
  } else {
    res.redirect("/login");
  }
});

app.post("/register", (req, res) => {
  User.register(
    { username: req.body.username },
    req.body.password,
    function (err, user) {
      if (err) {
        console.log(err.message);
        res.redirect("/register");
      } else {
        passport.authenticate("local")(req, res, function () {
          res.redirect("/secrets");
        });
      }
    }
  );
});

app.post("/login", (req, res) => {
  const user = new User({
    username: req.body.username,
    password: req.body.password,
  });
  req.login(user, function (err) {
    if (err) {
      console.log(err);
    } else {
      passport.authenticate("local")(req, res, function () {
        res.redirect("/secrets");
      });
    }
  });
});
node.js express cookies passport.js
1个回答
0
投票

尝试在快速会话配置中设置 cookie 的 maxAge

app.use(
  session({
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
     maxAge: 1000 * 60 * 60 * 24 //expires in 24hrs
  })
);

此处查看有关快速会话和 cookie 的文档。

© www.soinside.com 2019 - 2024. All rights reserved.