簡體   English   中英

(僅限 Safari)Axios 請求不會將 cookie 發送到 Node.js/Express REST API

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

問題

我正在構建一個 Vue.js Web 應用程序和一個 Node.js/Express REST API。

登錄后發送 cookie 時,它​​們會被接收,但不會與下一個請求一起發回。

后端

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

使用具有以下選項的中間件啟用 CORS:

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

成功登錄后(需要成功的 OPTIONS/預檢請求),響應如下所示:

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參數。

前端

使用 Axios 的 Vue.js Web 應用程序(在http://localhost:8080上通過 HTTP(非 HTTPS)本地運行)

使用帶有withCredentials: true選項的 Axios 發送請求。 使用 Firefox,令牌和會話 cookie 會自動包含為Cookie: session=XXX; token=XXX Cookie: session=XXX; token=XXX標頭,但在 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 在某些方面是否更安全,它不願意發送 cookie? 我在前端或后端更改哪些設置?

我想通了,這太荒謬了......

使用127.0.0.1:8080而不是localhost:8080導航到 Web 應用程序,一切都按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM