OAuth 2.0 وتفويض JWT في لغة C++: عملياً
\n\nنادراً ما تخلو تطبيقات الويب الحديثة والخدمات المصغرة من أنظمة التفويض. المعياران الأكثر شيوعاً - OAuth 2.0 لتفويض الوصول و JWT (JSON Web Token) لنقل البيانات المضغوطة - أصبحا المعيار الفعلي في الصناعة. في هذه المقالة، سنشرح كيفية تنفيذ عميل OAuth 2.0 والعمل مع JWT في لغة C++. ستحصل على أمثلة كود جاهزة وستفهم كيفية دمج هذه الآليات في مشروعك.
\n\nما هو OAuth 2.0 و JWT: نظرة عامة مختصرة
\n\nOAuth 2.0 هو بروتوكول تفويض يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون نقل اسم المستخدم وكلمة المرور الخاصة به. الأطراف الرئيسية: مالك المورد (المستخدم)، العميل (تطبيقنا)، خادم التفويض (الخادم الذي يصدر الرموز) و خادم المورد (الخادم الذي يوفر البيانات).
\n\nJWT هو تنسيق رمز يتكون من ثلاثة أجزاء: الرأس (خوارزمية التوقيع)، الحمولة (البيانات، مثل معرف المستخدم أو الدور) و التوقيع (توقيع يحمي من التزوير). غالباً ما يُستخدم JWT كرمز حامل (Bearer-token) في OAuth 2.0.
\n\nفي لغة C++، سنستخدم المكتبات cpprestsdk (لطلبات HTTP) و jwt-cpp (للعمل مع JWT). قم بتثبيتها عبر vcpkg:
vcpkg install cpprestsdk\nvcpkg install jwt-cpp\n\nتنفيذ عميل OAuth 2.0 في لغة C++
\n\nلننظر في سيناريو نموذجي: يجب على تطبيق C++ الخاص بنا أن يقوم بالمصادقة عبر Google OAuth 2.0. للقيام بذلك، نحتاج إلى: تسجيل التطبيق في Google Cloud Console، والحصول على Client ID و Client Secret، ثم تنفيذ تدفق رمز التفويض (Authorization Code Flow).
\n\nالخطوة 1: تكوين رابط التفويض
\n\nالخطوة الأولى هي إعادة توجيه المستخدم إلى صفحة تفويض Google. سنقوم بتكوين الرابط بالمعلمات اللازمة:
\n\n#include <string>\n#include <cpprest/http_client.h>\n#include <cpprest/uri_builder.h>\n\nusing namespace web;\nusing namespace web::http;\nusing namespace web::http::client;\n\nstd::string BuildAuthorizationUrl(const std::string& client_id,\n const std::string& redirect_uri,\n const std::string& state) {\n uri_builder builder(U("https://accounts.google.com/o/oauth2/v2/auth"));\n builder.append_query(U("client_id"), utility::conversions::to_string_t(client_id));\n builder.append_query(U("redirect_uri"), utility::conversions::to_string_t(redirect_uri));\n builder.append_query(U("response_type"), U("code"));\n builder.append_query(U("scope"), U("openid%20email%20profile"));\n builder.append_query(U("state"), utility::conversions::to_string_t(state));\n builder.append_query(U("access_type"), U("offline"));\n builder.append_query(U("prompt"), U("consent"));\n return utility::conversions::to_utf8string(builder.to_uri().to_string());\n}\n\nالخطوة 2: استبدال الرمز بالرمز المميز
\n\nبعد أن يؤكد المستخدم الوصول، سيعيد Google توجيهه إلى redirect_uri الخاص بنا مع المعامل code. يجب استبدال هذا الرمز بـ access_token و refresh_token:
pplx::task<web::json::value> ExchangeCodeForToken(\n const std::string& client_id,\n const std::string& client_secret,\n const std::string& redirect_uri,\n const std::string& code) {\n \n http_client client(U("https://oauth2.googleapis.com/token"));\n \n web::json::value body;\n body[U("code")] = web::json::value::string(utility::conversions::to_string_t(code));\n body[U("client_id")] = web::json::value::string(utility::conversions::to_string_t(client_id));\n body[U("client_secret")] = web::json::value::string(utility::conversions::to_string_t(client_secret));\n body[U("redirect_uri")] = web::json::va