Eine reine Header-Bibliothek zum Erstellen und Validieren von JSON-Web-Tokens in C++11. Eine tolle Einführung finden Sie hier.
Das Ziel besteht darin, eine vielseitige und universell anwendbare Sammlung von Algorithmen, Klassen und Datenstrukturen bereitzustellen und so die Anpassungsfähigkeit und nahtlose Integration mit anderen Bibliotheken zu fördern, die Sie möglicherweise bereits verwenden.
jwt-cpp unterstützt umfassend alle im Standard spezifizierten Algorithmen. Sein modularer Aufbau ermöglicht die nahtlose Einbindung zusätzlicher Algorithmen ohne Komplikationen. Wenn Sie neue Algorithmen beisteuern möchten, können Sie gerne eine Pull-Anfrage initiieren oder ein Problem eröffnen.
Der Vollständigkeit halber finden Sie hier eine Liste aller unterstützten Algorithmen:
HMSC | RSA | ECDSA | PSS | EdDSA |
---|---|---|---|---|
HS256 | RS256 | ES256 | PS256 | Ed25519 |
HS384 | RS384 | ES384 | PS384 | Ed448 |
HS512 | RS512 | ES512 | PS512 | |
ES256K |
Eine Installationsanleitung finden Sie hier.
Ein einfaches Beispiel ist das Dekodieren eines Tokens und das Drucken aller seiner Ansprüche. Probieren wir es einmal aus:
# include < jwt-cpp/jwt.h >
# include < iostream >
int main () {
std::string token = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCIsInNhbXBsZSI6InRlc3QifQ.lQm3N2bVlqt2-1L-FsOjtR6uE-L4E9zJutMWKIe1v1M " ;
auto decoded = jwt::decode (token);
for ( auto & e : decoded. get_payload_json ())
std::cout << e. first << " = " << e. second << std::endl;
}
Sie können dieses Beispiel lokal erstellen und ausführen, nachdem Sie das Repository geklont haben. Wenn wir einige Befehle ausführen, können wir den Inhalt der JWT-Nutzlast sehen
cmake .
cmake --build . --target print-claims
./print-claims
# iss = "auth0"
# sample = "test"
Sie werden sehr schnell feststellen, dass JWT nicht verschlüsselt, sondern kryptografisch signiert sind, um die Nichtabstreitbarkeit zu gewährleisten.
Um ein Token zu verifizieren, erstellen Sie zunächst einen Verifizierer und verwenden ihn, um ein entschlüsseltes Token zu verifizieren.
auto verifier = jwt::verify()
.with_issuer( " auth0 " )
.with_claim( " sample " , jwt::claim(std::string( " test " )))
.allow_algorithm(jwt::algorithm::hs256{ " secret " });
verifier.verify(decoded_token);
Der Prüfer ist zustandslos, sodass Sie ihn für verschiedene Token wiederverwenden können.
Das Erstellen des oben genannten Tokens (und das Signieren) ist genauso einfach.
auto token = jwt::create()
.set_type( " JWS " )
.set_issuer( " auth0 " )
.set_payload_claim( " sample " , jwt::claim(std::string( " test " )))
.sign(jwt::algorithm::hs256{ " secret " });
Wenn Sie weitere eindeutige Token ausstellen oder verifizieren möchten, sehen Sie sich die Beispiele für die Arbeit mit öffentlichen und privaten RSA-Schlüsseln, Token mit elliptischen Kurven und vielem mehr an!
Aufbauend auf dem Ziel der Flexibilität.
jwt-cpp unterstützt OpenSSL, LibreSSL und wolfSSL. Eine Liste der getesteten Versionen finden Sie auf dieser Seite. Weitere Einzelheiten finden Sie hier.
In diesem Zusammenhang besteht keine strikte Abhängigkeit von einer bestimmten JSON-Bibliothek. Stattdessen verwendet jwt-cpp ein generisches jwt::basic_claim
, dessen Vorlage auf Typmerkmalen basiert. Dieses Merkmal stellt die semantischen JSON-Typen für Werte, Objekte, Arrays, Zeichenfolgen, Zahlen, Ganzzahlen und boolesche Werte sowie Methoden zur nahtlosen Übersetzung zwischen ihnen bereit.
Dieses Design bietet Flexibilität bei der Auswahl der JSON-Bibliothek, die Ihren Anforderungen am besten entspricht. Um eines der bereitgestellten JSON-Merkmale zu nutzen, finden Sie detaillierte Anleitungen unter docs/traits.md.
jwt::basic_claim<my_favorite_json_library_traits> claim (json::object({{ " json " , true },{ " example " , 0 }}));
Um zu erfahren, wie Sie die Implementierung eines Merkmals schreiben, lesen Sie diese Anweisungen
Im Hinblick auf die Base64-Spezifikationen für JWTs enthält diese Bibliothek base.h
, das alle notwendigen Varianten umfasst. Während die Bibliothek selbst eine kompetente Base64-Implementierung bietet, ist es erwähnenswert, dass Base64-Implementierungen weit verbreitet sind und unterschiedliche Leistungsniveaus aufweisen. Wenn Sie lieber Ihre eigene Base64-Implementierung verwenden möchten, haben Sie die Möglichkeit, JWT_DISABLE_BASE64
zu definieren, um die jwt-cpp-Implementierung auszuschließen.
Wenn Sie Verbesserungsvorschläge haben oder einen Fehler festgestellt haben, zögern Sie bitte nicht, ein Problem zu eröffnen oder einen Beitrag zu leisten, indem Sie eine Pull-Anfrage erstellen. Geben Sie beim Melden eines Fehlers umfassende Details zu Ihrer Umgebung an, einschließlich der Compilerversion und anderer relevanter Informationen, um die Reproduktion des Problems zu erleichtern. Wenn Sie eine neue Funktion einführen, stellen Sie außerdem sicher, dass Sie entsprechende Testfälle einbeziehen, um deren Funktionalität zu validieren.
Um jwt-cpp nutzen zu können, benötigen Sie die folgenden Tools.
Um die Testfälle zu erstellen, benötigen Sie auch
Tipps finden Sie in den FAQs.