浏览器没有保存来自跨域服务器的会话cookie



我有一个问题,浏览器不存储从我的服务器发送的会话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-Server

Index.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或任何其他。

最新更新