Я разрабатываю веб-сайт с помощью django rest framework, django rest framework jwt для бэкэнда и next.js, react, redux для внешнего интерфейса.
С предположением,
хранить токен доступа в виде файлов cookie, а не в localStorage. Потому что я использую Next.js и хочу получить токен доступа перед первоначальным рендерингом.
Когда пользователь входит в систему, серверная часть отправляет токен доступа в виде файлов cookie.
истечение срока действия токена доступа и обновление, как показано ниже
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_COOKIE': 'token'
На основании вышеизложенного у меня есть несколько вопросов.
токен доступа истекает через 5 минут. В течение 5 минут пользователь может запросить страницу, на которой есть permission_classes = (IsAuthenticated,) с токеном доступа. Если прошло 5 минут, файлы cookie (токен доступа) автоматически исчезнут, и пользователю потребуется снова войти в систему. Чтобы этого избежать, существует система токена обновления, верно?
Если это правильно, когда и как обновить токен правильно?
Перед запросом к бэкэнду с токеном доступа всегда сравнивайте срок действия токена доступа с текущим временем, затем, если он скоро истечет, прекратите запрашивать один раз, сначала переключитесь на токен обновления с помощью axios, после получения нового токена перезапустите запрос с новым токеном. .
Это правильный путь?
Потому что это печенье, верно? Например, после входа пользователя в систему и ухода с компьютера на 10 минут. Пользователь вернулся и пытается увидеть веб-сайт, но ему нужно снова войти в систему. Поскольку в файлах cookie больше нет токена доступа, а также нельзя обновить токен. Что я должен делать?
Я хочу, чтобы пользователь не пытался войти в систему много раз и держал пользователя в системе до тех пор, пока не истечет срок действия токена обновления.





Вы можете использовать концепцию «перехватчика», например, она есть у аксиомы, вы можете добавить перехватчик ответа, и если сервер вернет специальную ошибку («token_expired»), то этот перехватчик будет обращаться к refresh-token API с помощью Refresh-токена что у него есть, получите новый токен доступа и повторите последний неудачный запрос.
Проверьте первый ответ здесь: https://github.com/axios/axios/issues/934#issuecomment-322003342
Надеюсь, это понятно.