我有一个问题,浏览器不存储从我的服务器发送的会话cookie。我的客户端web应用程序托管在Vercel和我的服务器应用程序托管在Heroku。我使用passport进行登录,登录成功后,将向浏览器发送一个会话cookie。这在本地运行应用程序时很好(即客户端在localhost:3000,服务器在localhost:5500)。但是,当两个应用程序都在远程托管上运行时,浏览器不会存储cookie。
CORS工作良好,因为我能够成功地从我的api获取数据。
我试过玩cookie会话选项(例如sameSite, secure, httpOnly, domain),运气为零。
我猜cookie可能被存储在服务器的URL下。我曾希望cookie-session选项"domain"可以把这个分类,但不幸的是它没有。
客户:
https://github.com/liamliamliam/RateFlix-Client https://rateflix.vercel.app/服务器:https://github.com/liamliamliam/RateFlix-ServerIndex.mjs
import 'dotenv/config';
import express from 'express';
import mongoose from 'mongoose';
import cookieSession from 'cookie-session';
import passport from 'passport';
import bodyParser from 'body-parser';
import cors from 'cors';
import './models/index.mjs';
import './services/passport.mjs';
import routes from './routes/index.mjs';
mongoose.connect(process.env.MONGODB_URI, console.log('Connected to MongoDB'));
const app = express();
app.use(
cors({
credentials: true,
origin: ['https://rateflix.vercel.app', 'http://localhost:3000']
})
);
app.use(bodyParser.json());
app.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [process.env.COOKIE_KEY]
})
);
app.use(passport.initialize());
app.use(passport.session());
routes(app);
app.get('/api/env', (req, res) => res.json({ env: process.env.NODE_ENV }));
const PORT = process.env.PORT || 5500;
app.listen(PORT, console.log(`Running on port ${PORT}`));
服务/护照。mjs (serializeUser, deserializeUser)
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id).then((user) => done(null, user));
});
由于一切都很好,您的客户端能够从您的后端获取数据,而没有任何CORS问题或其他问题,那么我高度相信cookie存储得很好。你确定你看的是正确的饼干吗?它们应该存储在web客户端的URL下。
请确保您正在检查该URL的cookie,而不是localhost或任何其他。