我在 https://somedomain.dev
( Angular )上有前端,在 https://api.somedomain.dev
上有 api (所以我有相同的域,但是不同的子域 - 这很重要,因为对于不同的整个域,Safari 会 block 所有 cookies )。我按以下顺序向 API 发送 3 个请求
POST/api/user/login
- 在响应服务器中设置HttpOnly COOKIE(带有授权 token :JWTGET/api/user/profile
- 获取用户配置文件(浏览器应添加 COOKIE 来请求)GET/api/buildings
- 获取建筑物(浏览器应添加 COOKIE 来请求)
问题:Safari 仅为 GET 配置文件
添加 Cookie,而不向 GET 建筑物
添加 Cookie(Chrome、Firefox 和 Edge 向每个获取请求)
所有请求详细信息( header 等):
- Chrome v.81.0:login , profile和 building
- Safari v. 13.1:login , profile和 building
- Angular:每个 get 请求都使用
withCredential: true
标志发送(当然这在 Chrome 中有效)
问题:为什么 Safari 不向 buildings
请求添加 cookie,以及如何强制 Safari(使用 JavaScript 或服务器代码)向所有请求添加 cookie(登录后) )?
最佳答案
好的 - 经过漫长的分析请求后,我终于发现了问题 - 在 login
响应中,服务器在 Set-Cookie
header 中设置了 cookie 生命周期
Max-Age: 43200;
这适用于 Chrome、Firefox 和 Edge - 但不适用于 Safari(可能 Safari 会将其视为 1 秒 cookie 生命周期,这就是为什么它只为第一个 GET 请求添加 cookie) - 所以我将其更改为
max-age=43200;
现在可以在任何地方使用:)
关于javascript - Safari 不向第二个 CORS 请求包含 COOKIE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61386688/