OAuth 2.0 وتفويض JWT في لغة C++: دليل كامل مع كود

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

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

ابدأ الدورة

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\n

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

\n\n

JWT هو تنسيق رمز يتكون من ثلاثة أجزاء: الرأس (خوارزمية التوقيع)، الحمولة (البيانات، مثل معرف المستخدم أو الدور) و التوقيع (توقيع يحمي من التزوير). غالباً ما يُستخدم JWT كرمز حامل (Bearer-token) في OAuth 2.0.

\n\n

في لغة C++، سنستخدم المكتبات cpprestsdk (لطلبات HTTP) و jwt-cpp (للعمل مع JWT). قم بتثبيتها عبر vcpkg:

\n\n
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:

\n\n
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                

المدونات

توصيات الكتب