JWT-Token in C++: Implementierung und Verifizierung mit jwt-cpp

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

JWT-Token in C++: Bibliothek jwt-cpp

\n\n

JSON Web Token (JWT) ist eine kompakte und eigenständige Methode zur Übertragung von Informationen zwischen Parteien als JSON-Objekt. In C++ gibt es mehrere Bibliotheken für die Arbeit mit JWT, aber eine der beliebtesten und bequemsten ist jwt-cpp. Sie bietet eine einfache API zum Erstellen, Signieren und Verifizieren von JWT-Token unter Verwendung verschiedener Algorithmen (HMAC, RSA, ECDSA).

\n\n

In diesem Artikel werden wir die wichtigsten Funktionen der Bibliothek jwt-cpp betrachten, lernen, Token zu erstellen und zu überprüfen, und Codebeispiele für typische Aufgaben analysieren.

\n\n

Installation von jwt-cpp

\n\n

Die Bibliothek jwt-cpp ist header-only, was die Integration in ein Projekt vereinfacht. Zur Installation reicht es, das Repository zu klonen:

\n\n
git clone https://github.com/Thalhammer/jwt-cpp.git
\n\n

Fügen Sie dann den Pfad zum Ordner include in den Einstellungen Ihres Compilers hinzu. Wenn Sie CMake verwenden, sieht die Einbindung wie folgt aus:

\n\n
add_subdirectory(jwt-cpp)\ntarget_link_libraries(your_project jwt-cpp)
\n\n

Die Bibliothek hängt von OpenSSL und jsoncpp (oder nlohmann/json) ab, stellen Sie daher sicher, dass diese installiert sind.

\n\n

Grundlegende Erstellung eines JWT-Tokens

\n\n

Das einfachste Beispiel ist die Erstellung eines Tokens mit dem HMAC-SHA256-Algorithmus. Dem Token können Standardfelder (iss, sub, exp, iat) und benutzerdefinierte Claims hinzugefügt werden.

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    // Token erstellen\n    auto token = jwt::create()\n        .set_issuer("auth0")\n        .set_subject("1234567890")\n        .set_issued_at(std::chrono::system_clock::now())\n        .set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1})\n        .set_payload_claim("name", jwt::claim(std::string("John Doe")))\n        .sign(jwt::algorithm::hs256{"secret-key"});\n\n    std::cout << "Token: " << token << std::endl;\n    return 0;\n}
\n\n

Als Ergebnis erhalten wir eine Zeichenfolge, die aus drei Teilen (Header, Payload, Signatur) besteht, getrennt durch Punkte.

\n\n

Verifizierung des Tokens

\n\n

Zur Überprüfung der Authentizität des Tokens muss derselbe geheime Schlüssel (oder der öffentliche Schlüssel für RSA) verwendet werden. Beispiel für die Verifizierung:

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // Ihr Token\n\n    try {\n        auto decoded = jwt::decode(token);\n        \n        // Signatur prüfen\n        auto verifier = jwt::verify()\n            .allow_algorithm(jwt::algorithm::hs256{"secret-key"})\n            .with_issuer("auth0");\n\n        verifier.verify(decoded);\n\n        // Daten extrahieren\n        std::cout << "Token ist gültig!" << std::endl;\n        std::cout << "Subject: " << decoded.get_subject() << std::endl;\n        std::cout << "Name: " << decoded.get_payload_claim("name").as_string() << std::endl;\n    } catch (const std::exception& e) {\n        std::cerr << "Verifizierungsfehler: " << e.what() << std::endl;\n    }\n\n    return 0;\n}
\n\n

Wichtig: Wenn das Token abgelaufen ist (exp), geändert oder mit einem anderen Schlüssel signiert wurde, wird eine Ausnahme ausgelöst.

\n\n

Arbeit mit RSA (asymmetrische Verschlüsselung)

\n\n

Für sicherere Systeme wird häufig RSA verwendet. In diesem Fall wird das Token mit einem privaten Schlüssel signiert und mit einem öffentlichen Schlüssel verifiziert.

\n\n
#include <jwt-cpp/jwt.h>\n#include <fstream>\n#include <sstream>\n\nint main() {\n    // Privaten Schlüssel aus Datei lesen\n    std::ifstream priv_file("private.pem");\n    std::stringstream priv_ss;\n    priv_ss << priv_file.rdbuf();\n    std::string private_key = priv_ss.str();\n\n    // Token mit RSA erstellen\n    auto token = jwt::create()\n        .set_issuer("myapp")\n        .set_subject("user123"                    

Empfehlungen