在 Chrome 警告中,它说“如果 cookie 应该在跨站点请求中发送,则指定 SameSite=None 和安全。这允许第三方使用。” 如何使用 express-session 正确执行此操作?
app.use(
cors({
credentials: true,
origin: ["http://localhost:3000", "https://elated-jackson-28b73e.netlify.app"] //Swap this with the client url
})
);
var sess = {
secret: 'keyboard cat',
cookie: {}
}
if (app.get('env') === 'production') {
app.set('trust proxy', 1) // trust first proxy
sess.cookie.secure = true // serve secure cookies
sess.cookie.sameSite = 'none'
}
app.use(session(sess))
Run Code Online (Sandbox Code Playgroud) 最近 Chrome 更新到 83.0.4103.116 版本似乎对 Cookie 处理带来了变化。
我为我的用户提供单点登录,让他们登录多个网站。与 Stackoverflow 类似,我正在使用 Jquery执行AJAX 请求:
crossDomain: true,
xhrFields: { withCredentials: true },
Run Code Online (Sandbox Code Playgroud)
在 PHP 中,我允许域:
// needed for cross-domain request
header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Credentials: true');
Run Code Online (Sandbox Code Playgroud)
但是,现在它不再起作用了。
在开发控制台中,我发现了一个带有工具提示的新警告:
“由于用户偏好,此 Set-Cookie 已被阻止”
如何解决这个问题?
更新:
我只是看到 Stackoverflow 的单点登录也不再起作用了!
PS:一个相关问题建议告诉您的用户从我的 POV 更改 Chrome 设置,我想避免这种情况。试想一下,通知数百万用户启用 Cookie 进行单点登录……
使用桌面浏览器(仅限 Chrome)时,我有一个有效的注册和登录端点,但当尝试使用移动浏览器注册或登录时,服务器超时。我怀疑这是因为我的会话 cookie 和 csurf cookie 没有随我的获取请求一起发送。
我在手机浏览器上打开了Safari开发,它没有显示任何cookie。我现在怀疑这是因为 MaxAge——
请注意,我的 api 和客户端位于不同的域:Heroku 和 Netlify。请参阅下面的代码:
CORS 选项
const options = {
origin: "clientUrl",
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
allowedHeaders: [
"Content-Type",
"Access-Control-Allow-Headers",
"Access-Control-Allow-Origin",
"Authorization",
"csrf-token"
],
exposedHeaders: [
"Content-Type",
"Access-Control-Allow-Headers",
"Access-Control-Allow-Origin",
"Authorization",
"csrf-token"
],
maxAge: 3600,
preflightContinue: true,
credentials: true
};
Run Code Online (Sandbox Code Playgroud)
CSURF配置
app.use(
csurf({
cookie: true,
domain: "clientUrl",
sameSite: "none"
})
);
Run Code Online (Sandbox Code Playgroud)
快速会话配置
app.use(
session({
//This is our Encryption Key
secret: process.env.sessionCode,
//We set resave to false because our mongo store implements the "touch" …Run Code Online (Sandbox Code Playgroud) 我遇到了无法在浏览器中设置 cookie 的问题,因为客户端托管在 Netlify 上,服务器托管在 Heroku 上。它在本地主机上运行良好,所以看起来它现在与跨域有关。
阅读了多篇关于此的文章后,似乎这可能与 cors 或我如何设置 cookie 有关。
我在某处读到它可能有助于添加secure: true和sameSite: "none"设置 cookie,所以我添加了它们,但没有帮助。我也尝试过domain在设置cookie时添加它,但不幸的是它也没有帮助。
我正在使用 Chrome,并已将设置从阻止第三方 cookie 更改为允许所有 cookie,因为我读到这有时可能是一个问题。然而它也没有产生任何新的结果。
我还读到,无论出于何种原因,它可能需要代理,或者可以通过在 Heroku 上托管客户端和服务器来解决这个问题。如果可能的话,我宁愿不做任何这些事情,但欢迎任何想法。
服务器端使用 Node js (express) 托管在 Heroku 上:
const express = require("express");
const app = express();
require("dotenv").config();
const cors = require("cors");
const mysql = require("mysql");
const jwt = require("jsonwebtoken");
const cookieParser = require("cookie-parser");
// port for heroku if needed
const PORT = 3001;
// app objects instantiated on creation of …Run Code Online (Sandbox Code Playgroud) cookies ×3
cross-domain ×2
express ×2
csrf ×1
heroku ×1
javascript ×1
jquery ×1
node.js ×1
php ×1
reactjs ×1