JWT токены в C++: библиотека jwt-cpp для аутентификации

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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);                    

Рекомендаций