(Только Safari). По запросу Ax ios не отправляются файлы cookie для Node.js / Express REST API. - PullRequest
1 голос
/ 26 марта 2020

Проблема

Я создаю веб-приложение Vue. js и API REST Node.js / Express.

При отправке файлов cookie после входа в систему они получены , но не отправлять обратно со следующим запросом.

Backend

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

Итак, еще раз: файлы cookie задаются с параметрами Max-Age, Path, Expires, HttpOnly и SameSite=Lax после успешного предварительного запроса CORS OPTIONS.

Frontend

Vue. js веб-приложение с использованием Ax ios (работает локально по HTTP (не HTTPS) на http://localhost:8080)

Запросы отправляются с использованием Ax ios с опцией withCredentials: true. При Firefox токен и сеансовые куки автоматически включаются в заголовок 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 более безопасным, чем то, что он не хочет отправлять куки? Какие настройки я могу изменить на интерфейсе или бэкэнде?

1 Ответ

0 голосов
/ 26 марта 2020

Я понял это, и это смешно ...

Перейдите к веб-приложению, используя 127.0.0.1:8080 вместо localhost:8080, и все работает как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...