(仅限 Safari)Axios 请求不向节点发送 cookie。js/Express REST API

(Safari Only) Axios request does not send cookies to Node.js/Express REST API

问题

我正在构建一个 Vue.js 网络应用程序和一个节点。js/Express REST API。

登录后发送 cookie 时,它​​们会被接收,但不会随下一个请求发回。

后端

Node.js/Express REST API(运行 在本地通过 HTTP(而非 HTTPS)在 http://localhost:3000 上)

使用具有以下选项的中间件启用 CORS:

app.use(require('cors')({
    origin: ['http://127.0.0.1:8080', 'http://localhost:8080'],
    methods: 'GET,POST,PUT,DELETE',
    credentials: true
}))

成功登录后(需要成功的 OPTIONS/preflight 请求),响应如下所示:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://localhost:8080
Content-Type: application/json; charset=utf-8
Vary: Origin
Set-Cookie: session=XXX; Max-Age=604800; Path=/api/v0; Expires=Thu, 02 Apr 2020 15:36:42 GMT; HttpOnly; SameSite=Lax
Set-Cookie: token=XXX; Max-Age=1800; Path=/api/v0; Expires=Thu, 26 Mar 2020 16:06:42 GMT; HttpOnly; SameSite=Lax
X-XSS-Protection: 1; mode=block
Date: Thu, 26 Mar 2020 15:36:42 GMT
Access-Control-Allow-Credentials: true
Content-Length: 203
Connection: keep-alive
X-Content-Type-Options: nosniff
ETag: W/"cb-dRDu0E2yjk3BHs7J/aXoYLLzsGM"
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
X-Download-Options: noopen
Strict-Transport-Security: max-age=15552000; includeSubDomains

所以重申一下:在成功的 CORS OPTIONS 预检后设置的 cookie 包括 Max-AgePathExpiresHttpOnlySameSite=Lax 参数请求。

前端

Vue.js 使用 Axios 的网络应用程序(运行 在 http://localhost:8080 上本地通过 HTTP(而非 HTTPS))

使用带 withCredentials: true 选项的 Axios 发送请求。在 Firefox 中,令牌和 session cookie 会自动包含为 Cookie: session=XXX; token=XXX header,但在 Safari 中则不会。

import Axios, { AxiosResponse } from 'axios'

const API = Axios.create({
    baseURL: 'http://127.0.0.1:3000/api/v0',
    timeout: 5000,
    withCredentials: true
})

...

async login(email: string, password: string): Promise<AuthenticationResponse> {
    return handleResponse(API.post('/auth/login', { email, password }))
}

...

async getUserById(id: string): Promise<UserResponse> {
    return handleResponse(API.get('/users/' + id))
}

我该如何解决这个问题? Safari 在某种程度上更安全​​,它不愿意发送 cookies 吗?我应该在前端或后端更改哪些设置?

我想通了,这很荒谬...

使用 127.0.0.1:8080 而不是 localhost:8080 导航到网络应用程序,一切正常。