У меня есть веб-сайт, который работает на 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
Я мог бы реализовать постоянное хранилище (есть некоторые библиотеки, которые делают это там), чтобы первоначальная проблема автоматически решалась, то есть состояние входа в систему сохраняется при полном обновлении. Однако это приводит к множеству проблем, связанных с кэшированием и истечением срока действия токенов, и, возможно, оно того не стоит.