Узел JS, экспресс-сессия, удаление cookie из клиентского браузера - PullRequest
1 голос
/ 09 октября 2019

Я работаю с приложением, которое уже имеет собственную инфраструктуру. Задача состоит в том, чтобы предотвратить вход пользователя в несколько браузеров. Наше приложение имеет единую архитектуру, поэтому в идеале пользователь должен работать только в одной вкладке браузера. И у меня есть проблема. Я не могу удалить cookie из клиента.

I. Вкратце.

Настройки приложения:

Сервер: NodeJS Порт: 8083

Клиент: VueJS Порт: 8088

Я использую модуль express-session для инициализации сеансамеханизм на стороне сервера и отправлять куки клиенту. Клиент не установил куки.

II. Подробности:

Корневым файлом сервера является index.js

В нем я делаю следующее:

  1. Подключаемый модуль express:
const express = require('express')
Подключите cors модуль:
const cors = require('cors')
Добавить cors настройки:
app.use(cors({
    origin: 'http://localhost:8088',
    credentials: true
}))

Затем я инициализирую сессию в файле user.js и получаю клиентские соединения:

  1. Подключите 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()

Итак, что я сделал:

  1. Я использую 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 тоже не работает.

Итак, как я могу решить эту проблему? Что мне делать?

1 Ответ

0 голосов
/ 10 октября 2019

Вы пытались удалить точный файл cookie, установив для него значение null, то есть, скажем, что вы имеете дело с файлом cookie с именем Views, вы можете удалить файл cookie, используя req.session.Views = null

Вместо этого

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' })
        })

Вы можете сделать имя вашего сеансового куки и установить его равным нулю, что

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