Пытаюсь реализовать авторизацию с использованием JWT токенов. Проблему, скорее всего, смогу описать и без кода, поскольку она, скорее всего, крайне банальна, но все равно хочу спросить.
Мое react приложение используется вместе с redux. В redux хранится состояние personData, которое состоит из двух полей - isAuth и person (объект с данными о пользователе).
При регистрации и логине я отправляю запрос на сервер (express + mongoose). Я создаю DeviceModel, к которому, собственно, и привязываю id пользователя и refreshToken. Таким образом я реализую функционал, который позволяет пользователю заходить с разных устройств. В куки записываю refreshToken и deviceId. Все это проходит успешно и на клиент я получаю такие вот данные:
{
person, // {fullname, email, ...}
tokens, // {accessToken, refreshToken}
deviceId // unique device id
}
Все это прекрасно работает, состояния изменяются. НО, что я делаю дальше.
При обновлении страницы я проверяю есть ли в localstorage accessToken. Если он там есть - отправлю запрос на обновление токенов, чтобы пользователь получил снова свежие токены
При запросе цепляются куки - deviceId и refreshToken. В этот момент в базе данных имеется Device-документ с точно таким же _id и refreshToken. НО, что в данном случае не работает))
На сервере ищется документ по deviceId (находится), проверяется refreshToken (валиден), а затем проверяется, что у найденного device поле refreshToken совпадает с тем, что я достал из куки.
И тут все проваливается, но не по причине какой-то ошибки на сервере, а по причине того, что у меня дублируется запрос - у меня проходит ДВА запроса на обновление токенов. Первый неудачный, который возвращает 401 статус, и видимо затем отправляется второй запрос - уже удачный
но я не понимаю, почему их отправляется два и как это работает)
* запрос на обновление отправляю с помощью useEffect(() => {....}, []) внутри App компонента