JWT токены в C++: библиотека jwt-cpp
JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанных на JSON. В C++ для работы с JWT широко используется библиотека jwt-cpp (автор Thalhammer). Она предоставляет удобный API для создания, верификации и декодирования JWT токенов с поддержкой различных алгоритмов подписи (HS256, RS256 и др.).
Библиотека написана на современном C++17, не требует внешних зависимостей (кроме OpenSSL для асимметричных алгоритмов) и активно поддерживается сообществом.
Установка jwt-cpp
Самый простой способ установки — через пакетный менеджер vcpkg или Conan:
// Через vcpkg
vcpkg install jwt-cpp
// Через Conan
conan install jwt-cpp/0.7.0@
// Или скопировать заголовочный файл в проект
git clone https://github.com/Thalhammer/jwt-cpp.git
Для компиляции с CMake достаточно указать:
find_package(jwt-cpp REQUIRED)
target_link_libraries(myapp jwt-cpp::jwt-cpp)
Основные возможности
- Создание токенов с произвольными claims (sub, iss, exp, custom).
- Верификация подписи и проверка времени жизни (exp, nbf).
- Декодирование payload без верификации (для отладки).
- Поддержка алгоритмов: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512.
- Кастомные валидаторы — можно добавить проверку любых полей.
Пример 1: Создание JWT токена (HS256)
#include <jwt-cpp/jwt.h>
#include <iostream>
int main() {
// Создаем токен с алгоритмом HS256
auto token = jwt::create()
.set_type("JWT")
.set_issuer("auth.pythonlib.ru")
.set_subject("user123")
.set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1})
.set_payload_claim("role", jwt::claim(std::string("admin")))
.sign(jwt::algorithm::hs256{"secret_key_12345"});
std::cout << "Созданный токен:\n" << token << std::endl;
return 0;
}
В этом примере мы создали токен с:
- типом JWT,
- издателем
auth.pythonlib.ru, - субъектом
user123, - сроком действия 1 час,
- кастомным полем
roleсо значениемadmin.
Пример 2: Верификация и декодирование
#include <jwt-cpp/jwt.h>
#include <iostream>
int main() {
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // Ваш токен
try {
// Декодируем без проверки подписи (только для чтения payload)
auto decoded = jwt::decode(token);
std::cout << "Issuer: " << decoded.get_issuer() << std::endl;
std::cout << "Subject: " << decoded.get_subject() << std::endl;
// Проверяем подпись и время жизни
auto verifier = jwt::verify()
.allow_algorithm(jwt::algorithm::hs256{"secret_key_12345"})
.with_issuer("auth.pythonlib.ru");
verifier.verify(decoded);
std::cout << "Токен валиден!" << std::endl;
} catch (const jwt::TokenExpiredError& e) {
std::cerr << "Ошибка: токен истек" << std::endl;
} catch (const jwt::InvalidAlgorithmError& e) {
std::cerr << "Ошибка: неверный алгоритм" << std::endl;
} catch (const std::exception& e) {
std::cerr << "Ошибка верификации: " << e.what() << std::endl;
}
return 0;
}
Пример 3: Работа с асимметричными ключами (RS256)
#include <jwt-cpp/jwt.h>
#include <fstream>
#include <sstream>
std::string read_file(const std::string& path) {
std::ifstream file(path); Также в библиотеке
Планировщик задач на C# (.NET): Quartz.NET, Hangfire, Coravel
CoreML для Swift: полное руководство с примерами
Swagger/OpenAPI генерация для JavaScript (Node.js) — инструменты и библиотеки
WebSocket библиотеки для Node.js: ws, Socket.IO и uWebSockets.js