Файл cookie запроса не возвращает данные сеанса Express, как ожидалось

Я пытаюсь создать элементарную функцию входа в систему и проверить, создает ли она сеанс, который я могу использовать позже. Я использую экспресс-сеанс и Redis для сохранения данных сеанса. Вот моя установка:

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(express.static(path.join(__dirname, 'client/build')))

app.use(cookieParser(process.env.COOKIE_SECRET))
app.use(session({
  store: new redisStore({
    host: '127.0.0.1',
    port: 6379
  }),
  secret: process.env.SESSION_SECRET,
  cookie: {maxAge: 1800},
  name: 'appName',
  resave: false,
  saveUninitialized: false
}))

app.use('/', routes)

Тогда мой маршрут входа:

router.post('/api/login', (req, res) => {
  req.session.userId = req.body.id
  req.session.email = req.body.email

  //do I need to send out a cookie with the session created here?
  res.set({'Set-Cookie': 'appSession=' + req.session.id})
  res.status(200).send({
    "message": `User ${req.body.id} logged in with cookie ${req.session.id}`
  })
})

Тогда, насколько я понимаю, я должен иметь возможность читать и добавлять в этот сеанс любые запросы, в которых я отправляю файл cookie обратно. Вот мой API для проверки:

router.post('/api/test' (req, res) => {
  if(req.session && req.session.userId) {
    res.status(200).send({"message": `User ID ${req.session.userId} is  authenticated`})
     } else {
       res.status(401).send({"message": `User ID ${req.session.id} is not authenticated`})
   }
})

Я отправляю запрос к этому API, используя Postman с заголовком Cookie: appName=${sessionID}, используя идентификатор сеанса, созданный в маршруте api/login. Это всегда создает новый идентификатор сеанса и возвращает ошибку 401.

Правильно ли я понимаю? Если да, то как мне создать это ожидаемое поведение?


person MDalt    schedule 15.11.2016    source источник


Ответы (1)


Теперь у меня есть ответ на этот вопрос - было несколько фрагментов, которые, как мне показалось, не были ясны из других источников в Интернете.

Во-первых, полезно отладить проблему, если у вас возникли проблемы с express-session, запустив сервер с DEBUG=express-session node server.js

Когда я сделал это, я понял, что express-session не находит созданный сеанс. Это произошло потому, что я устанавливал свойство maxAge в секундах, а не в миллисекундах, поэтому срок его действия истекал немедленно. Идиот.

Потом возникла еще одна проблема. Я получил следующий вывод отладки при попытке восстановить сеанс:

  express-session cookie unsigned +1ms
  express-session no SID sent, generating session +1ms

Это был синтаксический анализатор файлов cookie, который не нашел мой SessionId, потому что синтаксический анализатор файлов cookie должен использовать тот же ключ, что и express-session. Опять же, довольно очевидно в ретроспективе.

Надеюсь, это поможет кому-то, кто получает те же ошибки.

person MDalt    schedule 15.11.2016
comment
Спасибо, я часами бился головой о стол, пока не увидел ваше решение, идентификатор файла cookie / сеанса. В моем случае у меня был сеанс {cookie: secure: true}}. Установка куки: безопасно на ложь, добилась цели. - person Matt D; 23.08.2018