JWT-Tokens in C++: Die Bibliothek jwt-cpp
JSON Web Token (JWT) ist ein offener Standard (RFC 7519) zur Erstellung von Zugriffstokens auf Basis von JSON. In C++ wird für die Arbeit mit JWT häufig die Bibliothek jwt-cpp (Autor Thalhammer) verwendet. Sie bietet eine benutzerfreundliche API zum Erstellen, Verifizieren und Dekodieren von JWT-Tokens mit Unterstützung verschiedener Signaturalgorithmen (HS256, RS256 usw.).
Die Bibliothek ist in modernem C++17 geschrieben, benötigt keine externen Abhängigkeiten (außer OpenSSL für asymmetrische Algorithmen) und wird von der Community aktiv unterstützt.
Installation von jwt-cpp
Der einfachste Weg zur Installation ist über den Paketmanager vcpkg oder Conan:
// Über vcpkgvcpkg install jwt-cpp
// Über Conanconan install jwt-cpp/0.7.0@
// Oder die Header-Datei in das Projekt kopierengit clone https://github.com/Thalhammer/jwt-cpp.gitFür die Kompilierung mit CMake reicht die Angabe:
find_package(jwt-cpp REQUIRED)target_link_libraries(myapp jwt-cpp::jwt-cpp)Hauptfunktionen
- Erstellung von Tokens mit beliebigen Claims (sub, iss, exp, benutzerdefiniert).
- Verifizierung der Signatur und Prüfung der Gültigkeitsdauer (exp, nbf).
- Dekodierung des Payloads ohne Verifizierung (für Debugging).
- Unterstützte Algorithmen: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512.
- Benutzerdefinierte Validatoren — es können Prüfungen für beliebige Felder hinzugefügt werden.
Beispiel 1: Erstellung eines JWT-Tokens (HS256)
#include <jwt-cpp/jwt.h>#include <iostream>
int main() { // Token mit HS256-Algorithmus erstellen 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 << "Erstellter Token:" << token << std::endl; return 0;}In diesem Beispiel haben wir einen Token erstellt mit:
- Typ JWT,
- Aussteller
auth.pythonlib.ru, - Betreff
user123, - Gültigkeitsdauer 1 Stunde,
- benutzerdefiniertem Feld
rolemit dem Wertadmin.
Beispiel 2: Verifizierung und Dekodierung
#include <jwt-cpp/jwt.h>#include <iostream>
int main() { std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // Ihr Token
try { // Dekodieren ohne Signaturprüfung (nur zum Lesen des Payloads) auto decoded = jwt::decode(token); std::cout << "Issuer: " << decoded.get_issuer() << std::endl; std::cout << "Subject: " << decoded.get_subject() << std::endl;
// Signatur und Gültigkeitsdauer prüfen auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key_12345"}) .with_issuer("auth.pythonlib.ru");
verifier.verify(decoded); std::cout << "Token ist gültig!" << std::endl;
} catch (const jwt::TokenExpiredError& e) { std::cerr << "Fehler: Token ist abgelaufen" << std::endl; } catch (const jwt::InvalidAlgorithmError& e) { std::cerr << "Fehler: Ungültiger Algorithmus" << std::endl; } catch (const std::exception& e) { std::cerr << "Verifizierungsfehler: " << e.what() << std::endl; }
return 0;}Beispiel 3: Arbeiten mit asymmetrischen Schlüsseln (RS256)
#include <jwt-cpp/jwt.h>#include <fstream>#include <sstream>
std::string read_file(const std::string& path) { Auch in der Bibliothek
Datenvalidierung in Node.js mit Joi: Vollständige Anleitung
Maschinelles Lernen mit TypeScript: Überblick über ML-Bibliotheken im Jahr 2024
gRPC für C# (.NET): Bibliotheken, Einrichtung und Codebeispiele
Caching in Kotlin: Redis, Caffeine und Ehcache – ein vollständiger Leitfaden
HtmlAgilityPack für C# (.NET): Komplettguide mit Beispielen