Я работаю с приложением, у которого уже есть собственная инфраструктура. Задача - интегрировать механизм сессионных cookie. Я потратил много времени, чтобы понять, почему файлы cookie не устанавливаются на стороне клиента.
I. Вкратце.
Настройки приложения:
Сервер: NodeJS Порт: 8081
Клиент: VueJS Порт: 8088
Я использую модуль «экспресс-сеанс» для инициализации механизма сеанса на стороне сервера и отправки файлов cookie клиенту. Клиент не установил файлы cookie.
II. Подробности:
Корневой файл сервера - index.js.
В нем я делаю следующее:
Подключите express
модуль:
const express = require('express')
- Подключите
cors
модуль:
const cors = require('cors')
- Добавьте
cors
настроек:
app.use(cors({
origin: 'http://localhost:8088',
credentials: true
}))
Затем я инициализирую сеанс в файле user.js и получаю подключения клиента: Подключите express-session
модуль:
const session = require('express-session')
- Подключите маршрутизацию с помощью express.Router ():
const router = express.Router()
- Добавить настройки сеанса:
const EIGHT_HOURS = 1000 * 60 * 60 * 2
const {
SESS_NAME = 'sid',
SESS_LIFETIME = EIGHT_HOURS,
SESS_SECRET = 'test',
NODE_ENV = 'development'
} = process.env
const IN_PROD = NODE_ENV === 'production'
- Инициализировать сеанс:
router.use(session({
name: SESS_NAME,
resave: false,
saveUninitialized: false,
secret: SESS_SECRET,
cookie: {
maxAge: SESS_LIFETIME,
sameSite: false,
// Must have HTTPS to work 'secret:true'
secure: IN_PROD
}
}))
- Получать запросы клиентов до
router.post()
Клиентская часть приложения состоит из множества файлов. Клиент отправляет данные на сервер NodeJS с помощью модуля Axios.
Я прочитал несколько статей по этой теме и полагаю, что сделанные мной настройки на стороне сервера вполне достаточны для работы механизма сессионных файлов cookie. Это означает, что проблема находится на стороне Vue.
Что я сделал:
Я установил во всех файлах, где Axios отправляет данные на сервер, параметр withCredentials в истинном значении (withCredentials: true), чтобы передать ограничения CORS. Это не помогло
В производственном приложении есть другие URL-адреса для доступа к производственному серверу NodeJS. Я установил URL-адрес сервера NodeJS во всех файлах на стороне клиента. Это не помогло
Прочтите эту статью: форум Vue. Из этой статьи я понял, что эту проблему нужно решить с помощью axios.interceptors (Форум StackOverFlow). Я предположил, что если этот параметр установлен на одной из сторонних страниц клиента, возможно, файлы cookie должны работать хотя бы на этой странице. Это не помогло. Пытался установить такую настройку:
axios.defaults.withCredentials = true
И это:
axios.interceptors.request.use( function (config) {
console.log('Main interceptor success')
config.withCredentials = true;
return config;
},
function(error) {
// Do something with request error
console.log('Main interceptor error')
return Promise.reject(error);
}
)
Это не помогло
Подскажите, пожалуйста, в каком направлении мне двигаться? Верно ли, что на стороне клиента абсолютно на всех страницах должна быть axios.defaults.withCredentials = true
настройка для инициализации механизма файлов cookie? Какие детали я упускаю? Если я устанавливаю файлы cookie сеанса с нуля, механизм работает.