عميل OAuth لـ PHP: دليل شامل لتكامل المصادقة
\n\nOAuth (التفويض المفتوح) هو بروتوكول تفويض مفتوح يسمح بمنح طرف ثالث وصولاً محدودًا إلى موارد المستخدم دون نقل اسم المستخدم وكلمة المرور. في عالم PHP، توجد عدة مكتبات لتنفيذ OAuth 2.0، ولكن واحدة من أشهرها وأكثرها دعمًا هي League\\OAuth2-Client (The PHP League). توفر هذه المكتبة طريقة مرنة وآمنة لتكامل تسجيل الدخول عبر Google وFacebook وGitHub وVK (فكونتاكتي) وYandex والعديد من الخدمات الأخرى.
\n\nفي هذه المقالة، سنشرح بالتفصيل تثبيت عميل OAuth لـ PHP وإعداده واستخدامه من خلال مثال المصادقة عبر Google وVK. ستتعلم كيفية الحصول على access token وrefresh token وبيانات ملف المستخدم.
\n\nتثبيت عميل OAuth عبر Composer
\n\nللبدء، تحتاج إلى تثبيت المكتبة الأساسية والموفرين (محولات للخدمات المحددة). قم بتنفيذ الأمر التالي في الطرفية:
\n\ncomposer require league/oauth2-client\ncomposer require league/oauth2-google\ncomposer require league/oauth2-vk\n\nتدعم المكتبة PSR-7 (رسائل HTTP) وPSR-18 (عميل HTTP)، لذا يُوصى أيضًا بتثبيت Guzzle أو أي عميل HTTP متوافق آخر:
\n\ncomposer require guzzlehttp/guzzle\n\nالهندسة الأساسية لـ OAuth 2.0
\n\nيعمل OAuth 2.0 في PHP وفقًا للمخطط التالي:
\n- \n
- Client ID وClient Secret — تحصل عليهما عند تسجيل التطبيق في الخدمة (Google Cloud Console، VK Developers، إلخ). \n
- Redirect URI — عنوان URL على موقعك الإلكتروني حيث سيعيد الخدمة توجيه المستخدم بعد المصادقة. \n
- Authorization Code — رمز مؤقت يتم استبداله بـ access token. \n
- Access Token — مفتاح للوصول إلى API الخاص بالمستخدم. \n
- Refresh Token — يسمح بتحديث access token دون إعادة المصادقة. \n
مثال: تسجيل الدخول عبر Google
\n\nلننشئ معالجًا بسيطًا للمصادقة عبر Google. يُفترض أن لديك بالفعل client_id وclient_secret.
الخطوة 1. إعادة توجيه المستخدم إلى صفحة مصادقة Google
\n\n<?php\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n 'clientId' => 'ВАШ_CLIENT_ID',\n 'clientSecret' => 'ВАШ_CLIENT_SECRET',\n 'redirectUri' => 'https://ваш-сайт.ru/callback.php',\n]);\n\n// إنشاء URL للمصادقة\n$authUrl = $provider->getAuthorizationUrl([\n 'scope' => ['email', 'profile'], // الأذونات المطلوبة\n]);\n\n// حفظ state في الجلسة للحماية من CSRF\n$_SESSION['oauth2state'] = $provider->getState();\n\nheader('Location: ' . $authUrl);\nexit;\n\nالخطوة 2. معالجة callback (callback.php)
\n\n<?php\nsession_start();\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n 'clientId' => 'ВАШ_CLIENT_ID',\n 'clientSecret' => 'ВАШ_CLIENT_SECRET',\n 'redirectUri' => 'https://ваш-сайт.ru/callback.php',\n]);\n\n// التحقق من state لمنع هجمات CSRF\nif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n unset($_SESSION['oauth2state']);\n exit('Invalid state');\n}\n\ntry {\n // استبدال authorization code بـ access token\n $accessToken = $provider->getAccessToken('authorization_code', [\n 'code' => $_GET['code']\n ]);\n\n // الحصول على بيانات ملف المستخدم\n $resourceOwner = $provider->getResourceOwner($accessToken);\n $user = $resourceOwner->toArray();\n\n echo "مرحبًا، " . htmlspecialchars($user['name']) . "!";\n echo "البريد الإلكتروني: " . htmlspecialchars($user['email']);\n // حفظ الرمز المميز في قاعدة البيانات لـ