Я работаю с приложением, которое уже имеет собственную инфраструктуру. Задача состоит в том, чтобы предотвратить вход пользователя в несколько браузеров. Наше приложение имеет единую архитектуру, поэтому в идеале пользователь должен работать только в одной вкладке браузера. И у меня есть проблема. Я не могу удалить cookie из клиента.
I. Вкратце.
Настройки приложения:
Сервер: NodeJS Порт: 8083
Клиент: VueJS Порт: 8088
Я использую модуль express-session
для инициализации сеансамеханизм на стороне сервера и отправлять куки клиенту. Клиент не установил куки.
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 * 8
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()
Итак, что я сделал:
- Я использую
req.session.destroy
для удаления данных сеанса и ожидаю, что пользователь выхода из браузера определеннобраузер и куки очищаются.
req.session.destroy(err => {
if (err) {
return res.send({ error: 'Logout error' })
}
res.clearCookie(SESS_NAME, {path: '/'})
return res.send({ 'clearSession': 'success' })
})
К сожалению, ничего волшебного не происходит
Я читаю разные темы. Например, здесь ( GitHub ) предлагается вывод: используйте явный указатель пути cookie в методе res.clearCookie
, как показано выше. Это не сработало.
Написал эту настройку {path: '/'}
в настройках куки. Это тоже не сработало.
router.use(session({
name: SESS_NAME,
resave: false,
saveUninitialized: false,
secret: SESS_SECRET,
cookie: {
path: '/',
maxAge: SESS_LIFETIME,
sameSite: false,
// Must have HTTPS to work 'secret:true'
secure: IN_PROD
}
}))
И, как написано в документации экспресс-сессии ( NPM: экспресс-сессия ), этот путь является путем по умолчанию для cookieхранение.
Добавить
req.session = null
в req.session.destroy:
req.session.destroy(err => {
if (err) {
return res.send({ error: 'Logout error' })
}
req.session = null
res.clearCookie(SESS_NAME, {path: '/'})
return res.send({ 'clearSession': 'success' })
})
Это не сработало
delete req.session
тоже не работает.
Итак, как я могу решить эту проблему? Что мне делать?