
Ссылка на полную версию проекта на 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 ссылка на GitHub: auth0/java-jwt
<groupid>com.auth0</groupid> <artifactid>java-jwt</artifactid> |
В примере рассмотрим два варианта загрузки ключей.
- Загрузка подготовленной пары из файла
- Генерация ключей в момент работы приложения.
Для этого подготовим пару 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 > 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