Авторизация при помощи JWT

identity-with-rights

Авторизация с JSON Web Token позволяет нам единожды пройти аутентификацию и авторизацию с логином и паролем, получить JWT токен доступа, и далее в каждом новом запросе отправлять только токен, содержащий необходимую серверу информацию о пользователе.

Освежить знания про JWT можно тут.


JWT Access и Refresh токены


Для повышения уровня безопасности помимо токена доступа (access token) в схему взаимодействия также добавляют токен обновления (refresh token). По шагам процесс выглядит так:

  1. Клиент логинится и получает токен доступа (access token) и токен обновления (refresh token).
  2. Запрашивая ресурсы, требующие авторизации, клиент отправляет полученный на шаге 1 токен доступа.
  3. Когда срок жизни токена доступа истекает, клиент отправляет запрос на сервер с токеном обновления и получает новую пару токенов: токен доступа и токен обновления.
jwt-tokens-rq

Шаг 1. Получение клиентом пары токенов

access-token-auth

Шаг 2. Авторизация с токеном доступа


Различие этих двух токенов только в сроке жизни. Токен доступа может жить как 15 минут, так и сутки. Токен обновления обычно живёт гораздо дольше. В связи с этим токен обновления требует более надёжного хранения.


Заголовок Authorization с типом Bearer Token


Ранее мы уже научились посылать запрос с указанием заголовка Authorization с типом Basic Auth для передачи пары логин/пароль.

В случае отправки JWT токена необходимо выбрать тип авторизации Bearer Token и вставить полученный от сервера токен в поле Token.

Фактически заголовок примет вид:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJ1c2VyIiwicm9sZSI6IlNVQiIsImV4cCI6MTcxNjIzOTAyMn0.
JU-BsGZtEezJE58cxQSoAVmuxeleDSrMXzhjOApqQ5k
postman-auth-bearer

Authorization Type Bearer Token в Postman


Срок жизни JWT токена


JWT токен считается валидным до тех пор, пока не истек срок его жизни.

Для проверки срока жизни токен необходимо расшифровать, например на jwt.io, и сравнить значение в поле exp в payload с текущим моментом времени. Если значение меньше, значит токен протух - срок его жизни истёк.

Формат времени в поле exp представляет собой Unix Time, или количество секунд, прошедших с 1 января 1970 года.

Для приведения к более лёгкой для восприятия системе исчисления времени можно воспользоваться онлайн конвертерами.

jwt-expired-unix-time

Конвертация Unix времени на jwt.io при наведении курсора