connect-redis не сохраняет сеанс

Я пытался использовать connect-redis для использования экспресс-хранилища сеансов с AWS Elasticache. Сервер Redis в AWS, который я использовал, использует шифрование при передаче, шифрование в состоянии покоя и токен Redis AUTH.

я использую Passport с локальной стратегией для аутентификации пользователей

Вот как это выглядит в app.js, когда я его настраиваю:

const express = require('express'),
  app = express(),
  session = require('express-session'),
  awsHandler = require('./awsHandler'),
  passport = require('passport'),
 ....
 ....

awsHandler.retrieveServiceCredentials('session').then(keys => {
    let secret = keys.session_key;
    let redis_auth = keys.redis_auth;
    const redis = require('redis');
    const redisClient = redis.createClient({
      host: 'master.redis-connect.abcd.efg.cache.amazonaws.com',
      port: REDIS_PORT,
      auth_pass: redis_auth,
      tls: { checkServerIdentity: () => undefined }
    });
    const redisStore = require('connect-redis')(session);

    app.use(session({
      secret: secret,
      resave: false,
      saveUninitialized: false,
      store: new redisStore({
        client: redisClient
      })
    }));
  });
  ....
  ....
  app.use(passport.initialize());
  app.use(passport.session());

Дело в том, что я пытаюсь подключиться к своему веб-сайту и не получаю ни req.session, ни req.user (когда перед использованием SQLite с пакетом connect-sqlite3 у меня был req.user после входа в систему).

Я заметил, что в Redis ничего не сохраняется, когда я подключаюсь к серверу Redis и набираю KEYS * ключей нет. Однако, когда я пытаюсь установить ключ на сервере Redis, жестко закодированном в app.js, с помощью:

redisClient.set('ключ', 'значение')

Это установка ключа и значения на сервере (при вводе KEYS * мы видим это там). Таким образом, я успешно устанавливаю соединение с сервером Redis с клиентской библиотекой, однако, похоже, что-то там происходит, что я не настроил должным образом, поэтому сеансы сохраняются в Redis.

Я нахожусь в среде AWS (Elastic Beanstalk, Elasticache).

спасибо, что читаете и помогаете!

С наилучшими пожеланиями.


person Amir Shaneh    schedule 16.02.2020    source источник


Ответы (1)


Я решил это, это была проблема в моем коде: awsHandler.retrieveServiceCredentials — это асинхронная функция, которая вызывается через пару секунд. В потоке он уже инициализировал все в приложении (инициализацию сеанса паспорта, определение маршрутов, запуск сервера узла для прослушивания порта и т. д.), и поскольку извлечениеServiceCredentials возвращалось позже, порядок был неправильным, и он инициализировал все в приложении до того, как мы использовали app.use(prodSessionMiddleware), поэтому сеанс не включен в приложение.

Устанавливаем интервал каждую секунду, и проверяем логическое значение, если было вызвано 'then', если оно было вызвано, очищаем интервал и продолжаем жить :)

person Amir Shaneh    schedule 18.02.2020