我正在尝试使用 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");
});
}
});
});
尝试在快速会话配置中设置 cookie 的 maxAge
app.use(
session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000 * 60 * 60 * 24 //expires in 24hrs
})
);
在此处查看有关快速会话和 cookie 的文档。