JWT токены в C++: библиотека jwt-cpp
JSON Web Token (JWT) — это компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. В C++ для работы с JWT существует несколько библиотек, но одной из самых популярных и удобных является jwt-cpp. Она предоставляет простой API для создания, подписи и верификации JWT токенов с использованием различных алгоритмов (HMAC, RSA, ECDSA).
В этой статье мы рассмотрим основные возможности библиотеки jwt-cpp, научимся создавать и проверять токены, а также разберём примеры кода для типовых задач.
Установка jwt-cpp
Библиотека jwt-cpp является header-only (заголовочной), что упрощает её интеграцию в проект. Для установки достаточно склонировать репозиторий:
git clone https://github.com/Thalhammer/jwt-cpp.git
Затем добавьте путь к папке include в настройки вашего компилятора. Если вы используете CMake, подключение будет выглядеть так:
add_subdirectory(jwt-cpp)
target_link_libraries(your_project jwt-cpp)
Библиотека зависит от OpenSSL и jsoncpp (или nlohmann/json), поэтому убедитесь, что они установлены.
Базовое создание JWT токена
Простейший пример — создание токена с использованием алгоритма HMAC-SHA256. В токен можно добавить стандартные поля (iss, sub, exp, iat) и произвольные claims.
#include <jwt-cpp/jwt.h>
#include <iostream>
int main() {
// Создаём токен
auto token = jwt::create()
.set_issuer("auth0")
.set_subject("1234567890")
.set_issued_at(std::chrono::system_clock::now())
.set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1})
.set_payload_claim("name", jwt::claim(std::string("John Doe")))
.sign(jwt::algorithm::hs256{"secret-key"});
std::cout << "Токен: " << token << std::endl;
return 0;
}
В результате получится строка, состоящая из трёх частей (header, payload, signature), разделённых точками.
Верификация токена
Для проверки подлинности токена необходимо использовать тот же секретный ключ (или публичный ключ для RSA). Пример верификации:
#include <jwt-cpp/jwt.h>
#include <iostream>
int main() {
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // ваш токен
try {
auto decoded = jwt::decode(token);
// Проверяем подпись
auto verifier = jwt::verify()
.allow_algorithm(jwt::algorithm::hs256{"secret-key"})
.with_issuer("auth0");
verifier.verify(decoded);
// Извлекаем данные
std::cout << "Токен валиден!" << std::endl;
std::cout << "Subject: " << decoded.get_subject() << std::endl;
std::cout << "Name: " << decoded.get_payload_claim("name").as_string() << std::endl;
} catch (const std::exception& e) {
std::cerr << "Ошибка верификации: " << e.what() << std::endl;
}
return 0;
}
Важно: если токен просрочен (exp), изменён или подписан другим ключом, будет выброшено исключение.
Работа с RSA (асимметричное шифрование)
Для более безопасных систем часто используют RSA. В этом случае токен подписывается приватным ключом, а проверяется — публичным.
#include <jwt-cpp/jwt.h>
#include <fstream>
#include <sstream>
int main() {
// Читаем приватный ключ из файла
std::ifstream priv_file("private.pem");
std::stringstream priv_ss;
priv_ss << priv_file.rdbuf();
std::string private_key = priv_ss.str();
// Создаём токен с RSA
auto token = jwt::create()
.set_issuer("myapp")
.set_subject("user123")
.set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{2})
.sign(jwt::algorithm::rs256{private_key});
std::cout << "RSA токен: " << token << std::endl;
// Верификация с публичным ключом
std::ifstream pub_file("public.pem");
std::stringstream pub_ss;
pub_ss <& Также в библиотеке
Мониторинг PHP-приложений с помощью библиотеки php-ast и xhprof
Работа с Kafka в PHP: библиотеки, установка и примеры кода
WebSocket библиотеки Kotlin для создания реального времени в веб-приложениях