Какой алгоритм работы с JWT token?

Добрый день.
Пишу тестовое задание по react. Приложение представляет kanban доску, аналог trello.com, содержит несколько досок и карточки, который можно перетаскивать с доски на доску, и менять их порядок.
Но у меня нет опыта работы с JWT. Я никак не могу понять алгоритм действий. У меня всего две страницы - авторизация и собственно страница с досками.
Помимо API запросов для работы с карточками(с ними я разобрался) есть три запроса связанные с пользователем.
Первый запрос это создание пользователя:
Create user
Recieve data, create new user and return it. Also generate and return JWT token that can be used for authenticated requests
Запрос:
{
"username": "string",
"email": "user@example.com",
"password": "string"
}

Ответ:
{
"username": "string",
"email": "user@example.com",
"password": "string",
"token": "string"
}

Здесь, как я предполагаю, я получаю JWT token
Второй запрос на авторизацию:
Obtain JWT token
Receives data, return token that can be used for authenticated requests
Запрос:
{
"username": "string",
"password": "string"
}

Ответ:
{
"username": "string",
"token": "string"
}

И третий запрос, самый не понятный для меня:
Refreshed JWT token
Receives data adn returns a refreshed token (with new expiration) based on existing token. If 'orig_iat' field (original issued-at-time) is found, will first check if it's within expiration window, then copy it to the new token
Запрос:
{
"token": "string"
}

Ответ:
{
"token": "string"
}

Теперь вопросы, что именно я не могу понять.
Я знаю, что токен JWTкороткоживущий и многоразовый и используется для получения доступа к ресурсам, а Refreshed Token(RT) - долгоживущий, но одноразовый. При регистрации мы получаем JWT и с ним уже можно получить доступ к ресурсам API?
При авторизации мы получаем такой же тип JWT?
Как я понял, токен имеет строк жизни. Как узнать это время?
Как держать состояние (авторизован или нет) в приложении?
Я читал что токен можно хранить в LocalStorage. Есть ли смысл создавать переменную в state isAuth которая будет хранить состояние tru/false?
Как я понял, необходимо при загрузке любой страницы запрашивать состояние токена, не истекло ли его время. Для этого и нужен запрос Refreshed JWT token, который возвращает новую пару JWT + RT?
При каждом запросе, при работе с карточками необходимо делать предварительный запрос на проверку не протух ли токен?
Буду признателен за помощь.
  • Вопрос задан
  • 851 просмотр
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
При авторизации выдаются сразу оба токена, рабочий и refresh. Refresh-токен сохраняется в базе сервера вместе с идентификатором пользователя, рабочий токен хранить смысла нет.

Срок жизни записан в самом токене, как одно из полей полезной нагрузки (payload). Прочитать это поле может и сервер и клиент. Сервер в любом случае должен контролировать срок жизни токена, клиент может это делать сам, а может просто реагировать на ответы сервера.

Каждый запрос к серверу сопровождается рабочим токеном. Если срок жизни рабочего токена истёк, то сервер возвращает сообщение о необходимости обновления токена.

Запрос на обновление сопровождается refresh-токеном.
Если refresh-токен в базе помечен как уже использованный, то инактивируются (удаляются из базы) все refresh-токены данного пользователя и возвращается сообщение о необходимости повторной авторизации.
Refresh-токен отмечается в базе как использованный .
Если срок действия refresh-токена истёк или такого refresh-токена нет в базе сервера, то возвращается сообщение о необходимости повторной авторизации.
Возвращается новая пара токенов.

Где и как хранить токены на клиенте - вопрос предпочтений. Можно не хранить вообще, тогда при перезагрузке страницы пользователю придётся авторизоваться заново. Можно сохранять только refresh-токен, выполняя запрос на обновление при запуске приложения / открытии страницы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы