问题描述
嘿,这个问题使我发疯。
我遇到一个问题,其中Passport.Js似乎没有从用户发送回用户会话。其他一切似乎都可以正常工作,并且序列化或反序列化用户没有问题。
部署后,它似乎可以在Firefox上正常运行,但不能在Chrome上运行。当我使用http:// localhost:PORT在本地计算机上进行测试时,它可以在Chrome上运行,但在部署时却不能。
因为它在我的本地计算机上工作正常,所以我想知道这是否可能是https / http问题?
有人知道这个问题可能是什么吗?谢谢。
中间件:
app.use(cookieParser());
app.use(expressSession({
resave: true,saveUninitialized: true,secret: process.env.REACT_APP_SESSION_SECRET,}))
app.use(passport.initialize());
app.use(passport.session())
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors({
origin: "https://example.url",methods: "GET,HEAD,PUT,PATCH,POST,DELETE",credentials: true,}));
app.use(express.static('public'));
对服务器的请求示例:
fetch(`https:example.url/sync/`,{ credentials: 'include'})
.then({ // ... })
谢谢。
解决方法
花了几个小时找出答案后,我才知道问题出在哪里。发布以便其他人看到。
首先,肯定有一个http / https问题。我必须在Express服务器中实现以下中间件,以确保通过https安全地发送对google auth的请求。
app.enable('trust proxy')
其次,Chrome浏览器已设置cookie,但由于缺少cookie的安全性设置,因此未将其发送回服务器。从2020年2月开始,这是必需的。以下选项解决了此问题:
app.use(expressSession({
// .. other settings ..
cookie: {
sameSite: 'none',secure: true
}
}))
此处概述了要求:https://blog.chromium.org/2019/10/developers-get-ready-for-new.html
希望这有助于解决此问题的任何人。