Как безопасно сохранить авторизованное состояние пользователя на сайте React? - PullRequest
1 голос
/ 11 июля 2019

У меня есть веб-сайт, который работает на example.com. Веб-сайт выполняет AJAX-вызовы моего внутреннего API, который находится на api.example.com.

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

Бэкэнд имеет защищенные конечные точки, которые проверяют токен JWT при каждом запросе. Токен JWT хранится в файле cookie httpOnly. Он также содержит токен CSRF.

Помимо файла cookie JWT я также отправляю файл cookie CSRF, который не httpOnly. Каждый запрос клиента должен содержать значение этого файла cookie в специальном заголовке.

Пока все хорошо, но я хочу убедиться, что клиент делает все от него зависящее, чтобы пользователи не могли делать бессмысленные неаутентифицированные запросы. Поэтому в моем приложении React я объявил несколько частных маршрутов , которые проверяют, вошел ли пользователь в систему и, если нет, он перенаправляется на страницу входа. Зарегистрированное состояние сохраняется в хранилище Redux.

Проблема в том, что при полном обновлении хранилище Redux сбрасывается. Итак, как я вижу, у меня есть варианты:

Вариант 1) Проверить наличие файла cookie CSRF

Я проверяю подлинность пользователя, проверяя, есть ли у него файл cookie CSRF; Я также делаю это во время инициализации магазина. Если у них есть cookie, им разрешено перейти на защищенную страницу. Все последующие запросы на этой странице все еще проверяются на сервере для токена JWT и CSRF.

Вариант 2) Проверять каждый раз с бэкэндом

Я могу создать простую конечную точку на бэкэнде, которая используется для проверки того, вошел ли пользователь в систему. Поэтому вместо простой проверки файла cookie клиент может отправить запрос этой конечной точке и убедиться, что токен в файле cookie все еще в силе.

Вариант 3) Сохранить магазин Redux

Я мог бы реализовать постоянное хранилище (есть некоторые библиотеки, которые делают это там), чтобы первоначальная проблема автоматически решалась, то есть состояние входа в систему сохраняется при полном обновлении. Однако это приводит к множеству проблем, связанных с кэшированием и истечением срока действия токенов, и, возможно, оно того не стоит.

...