رموز JWT في C++: مكتبة jwt-cpp
JSON Web Token (JWT) هو معيار مفتوح (RFC 7519) لإنشاء رموز الوصول المستندة إلى JSON. في لغة C++، تُستخدم مكتبة jwt-cpp (للمؤلف Thalhammer) على نطاق واسع للعمل مع JWT. توفر واجهة برمجة تطبيقات (API) سهلة لإنشاء والتحقق وفك تشفير رموز JWT مع دعم خوارزميات التوقيع المختلفة (HS256, RS256 وغيرها).
المكتبة مكتوبة بلغة C++ الحديثة (C++17)، ولا تتطلب تبعيات خارجية (باستثناء OpenSSL للخوارزميات غير المتماثلة)، ويتم دعمها بنشاط من قبل المجتمع.
تثبيت jwt-cpp
أسهل طريقة للتثبيت هي من خلال مدير الحزم vcpkg أو Conan:
// عبر vcpkgvcpkg install jwt-cpp
// عبر Conanconan 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 << "الرمز المُنشأ:" << token << std::endl; return 0;}في هذا المثال، أنشأنا رمزًا يحتوي على:
- نوع JWT،
- المُصدر
auth.pythonlib.ru، - الموضوع
user123، - مدة صلاحية ساعة واحدة،
- حقل مخصص
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 << "المُصدر: " << decoded.get_issuer() << std::endl; std::cout << "الموضوع: " << 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) {