التفويض والمصادقة في C++: المكتبات والأمثلة العملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في المصادقة والتفويض في C++



المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول) هما مكونان أساسيان لأمان أي تطبيق حديث. في C++، يتم حل هذه المهام باستخدام مكتبات متخصصة تتيح دعم رموز JWT وOAuth 2.0 وتجزئة كلمات المرور وإدارة الجلسات. في هذه المقالة، سنستعرض الأدوات الرئيسية وطريقة تثبيتها وأمثلة على استخدامها.



المكتبات الرئيسية للمصادقة في C++



1. JWT-CPP — العمل مع JSON Web Tokens



JWT-CPP هي مكتبة خفيفة لإنشاء رموز JWT والتحقق منها. تدعم خوارزميات HMAC وRSA وECDSA. مثالية لواجهات REST API والخدمات المصغرة.



التثبيت:

git clone https://github.com/Thalhammer/jwt-cppcd jwt-cppmkdir build && cd buildcmake ..make && make install


مثال لإنشاء رمز والتحقق منه:

#include <jwt-cpp/jwt.h>#include <iostream>

int main() { // إنشاء رمز مع الحمولة auto token = jwt::create() .set_issuer("auth.example.com") .set_type("JWS") .set_payload_claim("user_id", jwt::claim(std::string("12345"))) .sign(jwt::algorithm::hs256{"secret_key"});

std::cout << "Token: " << token << std::endl;

// التحقق من الرمز auto decoded = jwt::decode(token); auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key"}) .with_issuer("auth.example.com");

try { verifier.verify(decoded); std::cout << "Token valid. User ID: " << decoded.get_payload_claim("user_id").as_string() << std::endl; } catch (const std::exception& e) { std::cerr << "Invalid token: " << e.what() << std::endl; } return 0;}


2. bcrypt-cpp — تجزئة كلمات المرور



توفر مكتبة bcrypt-cpp تجزئة آمنة لكلمات المرور باستخدام خوارزمية Blowfish. تتضمن توليد تلقائي للملح وحماية من هجمات القوة الغاشمة.



مثال على الاستخدام:

#include <bcrypt/BCrypt.hpp>#include <iostream>

int main() { std::string password = "SuperSecret123!";

// تجزئة كلمة المرور std::string hash = BCrypt::generateHash(password); std::cout << "Hash: " << hash << std::endl;

// التحقق من كلمة المرور if (BCrypt::validatePassword(password, hash)) { std::cout << "Password correct!" << std::endl; } else { std::cout << "Invalid password." << std::endl; } return 0;}


3. عميل OAuth2 — التكامل مع المزودين



لتطبيق تسجيل الدخول عبر Google أو GitHub أو Facebook، استخدم مكتبة cpp-httplib مع معالجة يدوية لتدفقات OAuth2. مثال للحصول على رمز الوصول عبر طلبات HTTP:



#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>

int main() { httplib::Client cli("https://oauth2.googleapis.com");

// معلمات الطلب (استبدلها بمعلماتك) auto res = cli.Post("/token", { {"code", "authorization_code"}, {"client_id", "YOUR_CLIENT_ID"}, {"client_secret", "YOUR_CLIENT_SECRET"}, {"redirect_uri", "http://localhost:8080/callback"}, {"grant_type", "authorization_code"} });

if (res && res->status == 200) { auto json = nlohmann::json::parse(res->body); std::cout << "Access token: " << json["access_token"].get<std::string>() << std::endl; } else { std::cerr << "Failed to get token" << std::endl; } return 0;}


4. إدارة الجلسات في C++



لإدارة جلسات المستخدمين، يمكنك استخدام std::unordered_map لتخزين بيانات الجلسة مؤقتًا، أو قواعد البيانات مثل Redis للتخزين الدائم. مثال بسيط:



#include <unordered_map>#include <string>#include <iostream>

std::unordered_map<std::string, std::string> sessions;

void createSession(const std::string& sessionId, const std::string& userId) { sessions[sessionId] = userId;}

std::string getUserBySession(const std::string& sessionId) { auto it = sessions.find(sessionId); if (it != sessions.end()) { return it->second; } return "";}

int main() { createSession("abc123", "user_42"); std::cout << "User: " << getUserBySession("abc123") << std::endl; return 0;}


الخلاصة



توفر C++ مجموعة قوية من الأدوات لتنفيذ المصادقة والتفويض. باستخدام مكتبات مثل JWT-CPP وbcrypt-cpp وcpp-httplib، يمكنك بناء أنظمة آمنة للتحقق من الهوية وإدارة الصلاحيات. اختر المكتبات المناسبة بناءً على متطلبات مشروعك، ولا تنسَ تحديث التبعيات بانتظام لضمان الأمان.

توصيات