javascript - (仅限 Safari)Axios 请求不会将 cookie 发送到 Node.js/Express REST API
问题描述
问题
我正在构建一个 Vue.js Web 应用程序和一个 Node.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-Age
、Path
、Expires
、HttpOnly
和参数。SameSite=Lax
前端
使用 Axios 的 Vue.js Web 应用程序(通过 HTTP(不是 HTTPS)在本地运行http://localhost:8080
)
withCredentials: true
使用带有选项的 Axios 发送请求。在 Firefox 中,令牌和会话 cookie 会自动作为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
使用而不是导航到 Web 应用程序localhost:8080
,一切都按预期工作。
推荐阅读
- python - python的cmake execute_process抛出“权限被拒绝”错误
- python - Tensorflow 1.14+ 序列化子类 Keras 层?
- kml - ScreenOverlay 方向
- firebase - 如何使只有保存字符串的用户才能看到 Flutter / Firebase
- mongodb - 如何使用 mongodb 和 nodejs 中的聚合来查看集合以进行插入和删除?
- asp.net-mvc - 在 ASP.NET MVC 应用程序的本地 IIS 部署期间“加密操作期间发生错误”
- c++ - deprecated_string_conv_gen:从字符串文字到指针到字符(非常量)的转换在 C++ 中已弃用
- reactjs - 如何从子函数更改父挂钩
- c++ - 在Linux中部分发送消息时如何处理sendmsg(2)?
- python - 如何从 beautifulSoup 中提取多个 html 标签?