JSON Web Tokens (JWT) in Java

Ссылка на полную версию проекта на GitHub:
Github TokenJWTProject

Что такое JWT?
JWT – это открытый стандарт (RFC 7519) для безопасного обмена информацией в виде объекта JSON, а поскольку сообщения имеют цифровую подпись, информации внутри можно доверять.

Ссылка на документацию по стандарту: RFC 7519
Ссылка на wiki: JSON Web Token

Наиболее распространенный сценарий использования JWT – авторизация. После входа пользователя в систему каждый последующий запрос будет включать токен. Этот токен позволяет пользователю получать доступ к маршрутам и делать запросы, которые разрешены только аутентифицированным пользователям.

Каждый токен состоит из трех частей:

Header: содержит информацию об алгоритме и типе токена

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload: содержит произвольные данные. Например, идентификатор вместе с датой истечения срока действия данного токена. Это гарантирует, что срок действия токена истечет со временем и его нельзя будет использовать бесконечно.

{
  "sub": "1234567890",
  "name": "Daenerys Targaryen",
  "iat": 1516239022
}

Signature: здесь генерируется токен. Он сочетает в себе версию header, payload в кодировке Base64URL c секретным ключом.

Части JWT имеют стандартизированные наборы полей. Можно список полный посмотреть тут: wiki

Пример готового токена: Base64URL(header) + Base64URL(payload) + Base64URL(signature)

JWT использует алгоритм HMAC для подписи (1 ключ), в качестве альтернативы также можно использовать алгоритм RSA с парой открытый / закрытый ключ.

Для удобства работы с JWT предлагаю несколько полезных сайтов:
Check / Debug / Encoded / Decoded JWT
https://jwt.io/
https://www.jsonwebtoken.io

– Online RSA Key Generator
https://travistidwell.com/jsencrypt/demo

Использовал:

Spring Boot JSON Web Token REST web сервис Swagger Junit 5

Необходимо выполнить:
– Генерация пары ключей (публичный/приватный);
– Загрузка ключей из файла;
– Генерация непосредственно токена JWT;
– Развернуть REST web сервис с публичным ключем (GET запрос);
– Написать несколько тестов на Junit;
– Запуск проекта из консоли;

Создадим maven проект и подключим необходимые зависимости в pom.xml

В качестве основной библиотеки для работы с JWT будет использоваться проект MIT ссылка на GitHubauth0/java-jwt

<groupid>com.auth0</groupid>
<artifactid>java-jwt</artifactid>

В примере рассмотрим два варианта загрузки ключей.

  1. Загрузка подготовленной пары из файла
  2. Генерация ключей в момент работы приложения.

Для этого подготовим пару Public / Private PKCS8 format, алгоритм RSA (1024, 2048), encoding PEM. Я воспользуюсь онлайн генератором Online RSA Key Generator.

Данные ключи в PKCS1 RSA Cryptography Standard. Необходимо Private key преобразовать в PKCS8 RSA Cryptography Standard. Одна команда в терминале. Где private_key_file – путь до локально сохраненного файла.

openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key_file  -nocrypt &gt; pkcs8_key

Проект настроен, можем переходить к написанию кода.

Структура проекта такая:

ru.gotoqa.config – Каталог содержит классы конфигурации Swagger
ru.gotoqa.models – Каталог для сущностей POJO обьектов для json
ru.gotoqa.controller – Реализация REST full web сервиса
ru.gotoqa.core – Логика подготовки и хранение ответов
ru.gotoqa.util – Каталог для вспомогательных методов

Ссылка на полную версию проекта на GitHub:
Github TokenJWTProject

Releated Post