passport-local cook ie и обработка базы данных сеанса - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время я пытаюсь настроить службу oauth для моего текущего проекта. Будучи новичком во всем этом, я прочитал много статей на эту тему, но мне все еще не хватает некоторых частей.

Моя среда:

  • серверы: узел, express, паспорт
  • аутентификация: локальная стратегия (с использованием моих собственных учетных записей / паролей)
  • У меня есть база данных с именем пользователя / паролем (пароли запускаются через bcrypt)
  • веб-интерфейс: реагирует, доступ к серверу осуществляется через суперагента

На моем сервере nodejs я использую эти модули:

  • express
  • express -сессия
  • express - mysql -сессия
  • паспорт
  • passport-local
  • bcrypt

Работают разные части решений: я могу создавать новых пользователей, создавать новые сессии, просматривать их содержимое в express - mysql -сессия базы данных.

Однако я весьма запутался в следующем:

  1. , когда мой веб-клиент пытается получить доступ к защищенным маршрутам, я, кажется, не получать любой повар ie в запросе. Неужели суперагент не отправит мой паспорт повару ie по умолчанию? Я где-то читал, что в одностраничных приложениях jwt может быть более подходящим, связано ли это с этой проблемой?

  2. , несмотря на все, что я прочитал, я все еще запутался в deserializeUser. Насколько я понимаю, с помощью решения passport-local при доступе веб-клиент отправит сеанс cook ie, который содержит идентификатор сеанса. Паспорт будет получать дополнительную информацию об этом сеансе из базы данных, а затем продолжать обрабатывать запрос. Этот сеанс извлечения информации происходит автоматически (в express - mysql -сессии?)? Или вам нужно «вручную» сделать это в deserializeUser (многие примеры показывают вызов User.findById)? Если вам нужно сделать это «вручную», это означает, что вам нужно получить доступ к express - mysql -базы данных с использованием другого соединения, отличного от того, которое использует этот модуль?

  3. чтобы выйти, достаточно ли req.logout (), чтобы убедиться, что сеанс полностью удален из базы данных сеанса?

1 Ответ

0 голосов
/ 05 мая 2020

Ответов, которые я нашел до сих пор:

  1. Нужно добавить метод withCredential к суперагенту, чтобы он отправлял куки аутентификации:
    res = await superagent
      .get(url)
      .withCredentials()
      .send();

На стороне CORS, на сервере, опция 'credentials' требуется, если используется модуль 'cors' npm, например:

app.use(cors({
  origin: ['http://localhost:3003'],
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
  credentials: true,
}));

Вся информация о сеансе автоматически извлекается этими модулями. Однако во многих примерах показано, что этот вызов возвращается в пользовательскую базу данных для получения дополнительной информации (права, другая информация). Цель состоит в том, чтобы не иметь одинаковую информацию в двух местах (сеансы БД и профили пользователей БД) и не получать их из синхронизации c (когда учетная запись закрывается и т. Д. c ...)

req.logout() отключает сеанс, но информация о сеансе остается в базе данных. Следующий вопрос поставил меня на правильный путь: как удалить cook ie при выходе из системы express + passport js? . Вам нужно использовать req.logout, res.session.destroy, и пока вы это делаете, res.clearCook ie для удаления клиента готовит ie:

router.post('/logout/',
  (req, res) => {
    req.logout();
    res.status(200).clearCookie('connect.sid', {
      path: '/',
      secure: false,
      httpOnly: false,
      domain: 'place.your.domain.name.here.com',
      sameSite: true,
    }).end();
    req.session.destroy();
  },

Сеанс отключен, база данных очищена, повар ie пропал.

...