我正在运行一个带有工作 Passport.js“本地”、“facebook”和“google”身份验证的 node.js。我使用 MongoDB 的 Express-Session 作为存储,一切都像魅力一样工作:会话在成功身份验证后被持久化,浏览器中的 Cookie 由 axios 发送,当我回来时会话被恢复。
但是,如果我转移到 https,我的会话将无法恢复。我可以登录,在 mongoDB 中查看我的会话,在浏览器中查看我的 cookie,但是会话没有被拉取,并且 req.user 中没有任何内容。
对于我在网上可以阅读的内容来说,我的代码看起来非常“常见”,看不到任何明显不同的缺失:
const dotenv = require('dotenv');
const express = require('express');
const app = express();
const https = require('https');
var fs = require('fs');
const cors = require('cors');
const session = require("express-session");
const bodyParser = require("body-parser");
const passport = require('./passport/passport');
const authRoutes = require('./routes/auth');
const userRoutes = require('./routes/user');
const ensureAuthenticated = require('./middlewares/auth/ensureAuthenticated');
const ensureAuthorized = require('./middlewares/auth/ensureAuthorized');
const connectMongoDb = require('./mongoDb/connectMongoDb');
const mongoose = require("mongoose");
const MongoStore = require('connect-mongo')(session);
dotenv.config();
connectMongoDb();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors({
origin: `${process.env.CLIENT_HOST_URI}:${process.env.CLIENT_PORT}`,
credentials: true
}));
app.use(session({
secret: process.env.SESSION_COOKIE_SECRET,
resave: false,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
cookie: { maxAge: 24 * 60 * 60 * 1000 }
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/api/auth', authRoutes);
app.use('/api/user', ensureAuthenticated, userRoutes);
https
.createServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.cert')
}, app)
.listen(process.env.API_SERVER_PORT, () => {
console.log(`Server has started on port ${process.env.API_SERVER_PORT} over HTTPS`);
});
我怀疑这可能与我正在使用的自签名证书有关。但是......我不敢相信我应该部署并获得真正的证书才能在开发模式下在我的笔记本电脑上完成这项工作。
我还想知道是否有任何日志可以告诉我出了什么问题。
谢谢你的帮助, 大卫
我发现问题所在了。至少就我而言。
我从 chrome 中发现了这个:
这导致我在 cookie 配置对象中添加以下属性:
sameSite: 'None',
实施此更改后,我在 chrome 中看到了另一条消息:
这有效,它最初抱怨的原因可能是因为我正在运行我的前端/客户端
http://localhost:3000
和我的后端/api来自
https://localhost:4000
...严格来说,不同的主机。
我的 cookie 配置就变成了:
cookie: {
secure: true,
sameSite: 'None',
maxAge: 24 * 60 * 60 * 1000
}
希望这对社区有帮助。
cookie: {
secure: true,
sameSite: 'None',
maxAge: 24 * 60 * 60 * 1000
}
这绝对适用于之前的答案!