嗨,我的代码在 localhost 上运行良好,但是在部署中将其推送到 heroku 时,我无法将 cookie 安全标签设置为 true。当我将 cookie 安全设置为 false 时,代码在生产环境中运行良好。由于 cookie 不安全,它没有被传递到浏览器,并且护照 js 不允许身份验证。会话正在 mongodb 中创建,没有问题。
由于代码在开发中运行良好且安全标记为假[以及在我强制执行时在生产中],因此我确信护照 js 配置正确。
我还尝试设置 CORS 和 sameSite: 'none'; 我发现的类似问题提出了建议,但这也没有用。
任何帮助和建议都会很棒,因为我已经苦苦挣扎了一段时间。提前致谢。
注意:heroku 日志和本地都没有错误,我认为它是关于按正确的顺序放置代码。
require('dotenv').config();
const express = require("express")
const ejs = require("ejs")
const bodyParser = require("body-parser")
const cors = require("cors")
const mongoose = require('mongoose')
const session = require("express-session")
const MongoStore = require("connect-mongo")
const passport = require("passport")
const passportLocalMongoose = require("passport-local-mongoose")
const app = express();
app.set('trust proxy', true);
app.use(cors({credentials:true}));
app.disable('x-powered-by');
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
const conn = mongoose.connect(process.env.MONGODBURI, {
useUnifiedTopology: true
}).then(m => m.connection.getClient())
const sessionObject = {
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {},
store: MongoStore.create({
clientPromise: conn,
ttl: 3 * 60 * 60
})
}
if (process.env.NODE_ENV === 'production') {
sessionObject.cookie.secure = true // serve secure cookies over https
sessionObject.cookie.sameSite = 'none'
} else {
sessionObject.cookie.secure = false // serve unsecure cookies
}
app.use(session(sessionObject));
app.use(passport.initialize());
app.use(passport.session());