Connect-Redis не хранит сессию - PullRequest
0 голосов
/ 16 февраля 2020

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

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

Вот как это выглядит в приложении. 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, жестко закодированный в приложении. js с помощью:

redisClient.set ('key', 'value')

Это НАСТРОЙКА ключ и значение на сервере (при наборе KEYS * мы можем увидеть его там). Поэтому я успешно установил sh соединение с сервером redis с клиентской библиотекой, однако, там, кажется, что-то происходит, что я не настраиваюсь должным образом, поэтому сеансы сохраняются в Redis.

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

спасибо за чтение и помощь!

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

1 Ответ

0 голосов
/ 18 февраля 2020

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

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

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