المصادقة والتفويض في C++: المكتبات والتنفيذ

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

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

ابدأ الدورة

المصادقة والتفويض في C++: نظرة عامة على الأدوات والتنفيذ



في التطوير الحديث باستخدام C++، تأتي قضايا الأمان في المقام الأول. بغض النظر عما إذا كنت تقوم بإنشاء تطبيق خادم، أو عميل سطح مكتب، أو نظامًا مدمجًا، فإن آليات المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول) تعتبر بالغة الأهمية. في هذه المقالة، سنستعرض المكتبات والمناهج الرئيسية لتنفيذ هذه الآليات في C++.



المفاهيم الأساسية

قبل الانتقال إلى الأدوات، من المهم التمييز بين المفهومين:

  • المصادقة — عملية التحقق من أن المستخدم هو من يدّعي (اسم مستخدم + كلمة مرور، قياسات حيوية، رمز مميز).
  • التفويض — تحديد الموارد والعمليات المتاحة للمستخدم المُصادق عليه (الأدوار، الصلاحيات، قوائم التحكم في الوصول ACL).


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



1. libbcrypt — تجزئة كلمات المرور

لتخزين كلمات المرور بشكل آمن، لا تستخدم أبدًا النص العادي أو MD5. libbcrypt هو تطبيق C++ لخوارزمية bcrypt، وهي المعيار الصناعي لتجزئة كلمات المرور.

#include <bcrypt/bcrypt.h>#include <iostream>

int main() { const char* password = "my_secure_pass123"; char salt[BCRYPT_HASHSIZE]; char hash[BCRYPT_HASHSIZE];

// توليد الملح والتجزئة bcrypt_gensalt(12, salt); // 12 جولة (عامل التكلفة) bcrypt_hashpw(password, salt, hash);

std::cout << "Hash: " << hash << std::endl;

// التحقق من كلمة المرور const char* test_pass = "my_secure_pass123"; if (bcrypt_checkpw(test_pass, hash) == 0) { std::cout << "كلمة المرور صحيحة!" << std::endl; } else { std::cout << "كلمة مرور خاطئة." << std::endl; } return 0;}


2. jwt-cpp — العمل مع رموز JWT المميزة

تُستخدم رموز JSON Web Tokens (JWT) على نطاق واسع في REST API لنقل بيانات المصادقة. توفر مكتبة jwt-cpp واجهة سهلة لإنشاء الرموز المميزة والتحقق منها.

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

int main() { // إنشاء رمز مميز auto token = jwt::create() .set_issuer("auth.myapp.com") .set_type("JWS") .set_payload_claim("user_id", jwt::claim(std::string("12345"))) .set_payload_claim("role", jwt::claim(std::string("admin"))) .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.myapp.com");

try { verifier.verify(decoded); auto user_id = decoded.get_payload_claim("user_id").as_string(); std::cout << "User ID: " << user_id << std::endl; } catch (const std::exception& e) { std::cerr << "خطأ في التحقق: " << e.what() << std::endl; } return 0;}


3. cpp-httplib + OAuth2 — المصادقة عبر خدمات الطرف الثالث

لتنفيذ OAuth2 (على سبيل المثال، تسجيل الدخول عبر Google أو GitHub)، غالبًا ما يتم استخدام مزيج من عميل HTTP ومكتبة للعمل مع JSON. cpp-httplib هي مكتبة خفيفة لطلبات HTTP.

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

using json = nlohmann::json;

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

// معلمات الحصول على الرمز المميز (مبسطة) auto res = cli.Post("/token", { {"code", "authorization_code_from_redirect"}, {"client_id", "your_client_id"}, {"client_secret", "your_client_s

توصيات