Skip to content

Аутентификация

Пользователь сайта является гостем по умолчанию. У гостя ограниченный функционал и его возможности заканчиваются на просмотре открытого контента (статические страницы, лоты, профили пользователей).

Чтобы расширить этот функционал, гость должен войти в аккаунт.

Основное положение

На запросы входа или регистрации, сервер проверяет полученные данные и сопоставляет их с существующими записями. В случаее успеха - выдает пару токенов для получения доступа к системе через определенного пользователя.

Чтобы войти в систему, пользователь вводит: логин и пароль.

Чтобы создать аккаунт, пользователь вводит: уникальный логин, уникальную почту и пароль.

Токены

Токены предоставляют собой средство авторизации для каждого запроса от клиента к серверу. Они генерируются на сервере основываясь на секретном ключе.

  • JWT Access Token - токен с коротким временем жизни, который используется для авторизации запросов и хранения дополнительной информации о пользователе.

  • JWT Refresh Token - токен с длительным временем жизни, который выдается сервером по результам успешной аутентификации и используется для получения новой пары access/refresh токенов.

Выдача токенов

Когда пользователь входит на сайт, сервер сохраняет refresh токен в куке и refresh сессию в кеше, а клиенту отправляет access токен, который хранится в оперативной памяти приложения.

Чтобы обновить токен доступа, клиент отправляет запрос на перезагрузку с прикрепленным в куках refresh токеном, сервер его забирает, ищет в кеше эту сессию, обновляет ее и выдает новую пару токенов, если такая сессия существует.

Токен доступа на клиенте

Так как access токен сохранен в памяти, после перезагрузки приложения или открытия другой вкладки, токен будет отсутствовать. Чтобы это исправить:

  • Каждое открытие приложения будет отправлять запрос на перезагрузку токена.
  • Каждый полученый access токена будет отправляться другим вкладкам через Broadcast.
  • Запрос на перезагрузку будет отправлятся клиентом автоматически, когда время жизни токена будет подходить к концу.

Refresh-сессии

При создании новой пары токенов, в кеш добавляется refresh-сессия с мета информацией.

При перезагрузке пары токенов, сервер будет искать refresh-сессию по присланному в куках refresh токену и если найдет - обновит пару ключей и сессию, а если нет - откажет в перезагрузке.

Чтобы токен удалялся когда его время жизни закончится, выставляется TTL.

Смысл refresh-сессии в том, чтобы хранить только активные входы в аккаунт, а мета информация дает пользователю больше информации о активных сессиях.

Пример

Устройство X использует токен доступа Y (10 минут до истечения) и токен перезагрузки Z (60 дней до истечения). Токен Z есть в куках и в кеше приложения.

Если из кеша удалить токен Z, устройство продолжит получать доступ к аккаунту через токен Y, но обновить его не сможет, так как токен Z есть в куках, но его нет в кеше приложения.

Восстановление

Чтобы восстановить пароль, пользователь вводит логин забытого аккаунта, а сервер генерирует токен восстановления, добавляет его в кеш, и отправляет на почту забытого акканута в виде ссылки.

Чтобы понять, какому пользователю нужно сбросить пароль, токен добавляется в кеш со значением PK пользователя и TTL.

Как только он сбросит пароль, все токены восстановления и все refresh-сессии с этим пользователем будут удалены.

Развитие событий

Вход с правильными данными
  • Сервер получает запрос на вход
  • Проверяет логин и пароль
  • Если все хорошо, генерирует пара токенов
  • refresh-сессию добавляет в кеш
  • refresh токен добавляет в httpOnly куку
  • access токен отправляет пользователю
Перезагрузка, открытие новой страницы, истечение токена
  • Сервер получает запрос на перезагрузку токена
  • Ищет refresh-сессию по refresh токену
  • Если такая сессия есть, генерирует новую пару токенов
  • Старая запись в кеше заменяется на новую
  • Старый токен в куках заменяется на новый
  • В ответе отправляется новый access токен
Выход из аккаунта
  • Сервер получает запрос на выход
  • Проверяет валидность access токена
  • Ищет refresh-сессию по refresh токену из куки
  • Если существует, сравнивает userId из refresh-сессии с userId из access токена
  • Если id равны, удаляет refresh-сессию и refresh токен из куки
  • Клиент удаляет access токен у себя
Другие ситуации
  • Пользователь не заходит больше жизни refresh токена - токен из куки не будет найден в кеше, нужно заново авторизироваться.

  • Хакер украл access токен - его время жизни ограничено, по этому ущерб будет минимален и легко восстановляемым.

  • Хакер украл refresh токен - его перезагрузка вызовет выход из сессии у пользователя. Пользователь заново войдет под другой сессией и вручную удалит подозрительную сессию в настройках.