从快递.js通过 React 设置 cookie.js 不会设置。(已设置 CORS,凭据:'include'使用)



我正试图通过React前端从express后端设置cookie。cookie包含在响应标头中,但不会由浏览器设置。我用Chromium和Firefox进行了测试,但运气不佳。然而,在Postman中,它将cookie设置得非常好。

我尝试了我在这里找到的所有建议,但没有一个对我有效

快捷cookie选项:

exports.COOKIE_OPTIONS = {
httpOnly: true,
secure: false,
signed: true,
maxAge: eval(process.env.REFRESH_TOKEN_EXPIRY) * 100,
sameSite: 'Lax'
}

Expresscors设置:

const whitelist = process.env.WHITELISTED_DOMAINS
? process.env.WHITELISTED_DOMAINS.split(",")
: []
const corsOptions = {
origin: function (origin, callback) {
if (!origin || whitelist.indexOf(origin) !== -1) {
callback(null, true)
} else {
callback(new Error("Not allowed by CORS"))
}
},
credentials: true,
}
app.use(cors(corsOptions))

在.env 中使用WHITELISTED_DOMAINS = http://localhost:3000

使用cookie快速响应:

res.cookie("refreshToken", refreshToken, COOKIE_OPTIONS);
res.send({success: true, token});

React获取方式:

fetch(process.env.REACT_APP_API_ENDPOINT + "users/login", {
method: "POST",
credetials: "include",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({username, password})
});

其他一切都很正常,例如可以读取正文中的令牌。

编辑

我还尝试了以下选项,这些选项是我从这个答案中得到的:
Cookie选项

exports.COOKIE_OPTIONS = {
httpOnly: true,
secure: true,
signed: true,
maxAge: eval(process.env.REFRESH_TOKEN_EXPIRY) * 100,
SameSite: 'none'
}

cookie响应

res.header('Access-Control-Allow-Credentials', true);
res.header("Access-Control-Allow-Headers", "X-Custom-Header");
res.cookie("refreshToken", newRefreshToken, COOKIE_OPTIONS);
res.send({success: true, token});

但它也不起作用。同样的结果。Set Cookie存在于响应中,但不会被存储。

响应图片:
响应

无cookie

问题出在sameSite选项上。显然,这将与SameSite的处理方式不同。使用大写的SameSite";S〃;工作非常好。

如果有人能详细说明为什么会发生这种情况,我会很高兴。

相关内容

  • 没有找到相关文章

最新更新