عميل OAuth لـ PHP: التكامل مع Google وGitHub وVK

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

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

ابدأ الدورة

عميل OAuth لـ PHP: دليل كامل للتكامل



في تطوير الويب الحديث، أصبح OAuth (Open Authorization) المعيار الفعلي لتنظيم الدخول عبر الخدمات الخارجية. يسمح عميل OAuth لـ PHP للمستخدمين بتسجيل الدخول إلى موقعك عبر حسابات Google وGitHub وVK ومزودين آخرين دون الحاجة إلى إنشاء تسجيل منفصل.



في هذه المقالة، سنستعرض مكتبة PHP الشهيرة League OAuth2 Client، التي توفر واجهة موحدة للعمل مع مزودي OAuth2 المختلفين.



ما هو OAuth2 ولماذا هو مطلوب؟



OAuth2 هو بروتوكول مصادقة يسمح بتفويض الوصول إلى موارد المستخدم. بدلاً من تخزين كلمات المرور من الخدمات الخارجية، تحصل على رمز وصول مؤقت. المزايا الرئيسية:



  • الأمان — لا يتم نقل كلمات مرور المستخدمين إلى تطبيقك
  • الراحة — يدخل المستخدمون بنقرة واحدة
  • الثقة — مخاطر أقل لتسرب البيانات
  • بيانات إضافية — يمكن الحصول على البريد الإلكتروني والاسم والصورة الرمزية ومعلومات أخرى


تثبيت مكتبة League OAuth2 Client



للعمل مع OAuth2 في PHP، يُوصى باستخدام الحزمة الرسمية league/oauth2-client. يتم التثبيت عبر Composer:



composer require league/oauth2-client


بالنسبة لمزودين محددين، ستحتاج إلى حزم إضافية. على سبيل المثال:



composer require league/oauth2-google      # Googlecomposer require league/oauth2-github       # GitHubcomposer require digitalcloud/oauth2-vk     # VK (غير رسمية)


الهندسة الأساسية لعميل OAuth2



أي عميل OAuth2 يعمل وفق المخطط التالي:



  1. يضغط المستخدم على زر "تسجيل الدخول عبر المزود"
  2. يقوم تطبيقك بتوجيه المستخدم إلى صفحة المصادقة الخاصة بالمزود
  3. يؤكد المستخدم الوصول
  4. يعيد المزود رمز المصادقة إلى URI الخاص بالاستدعاء (callback)
  5. يستبدل تطبيقك الرمز برمز الوصول
  6. باستخدام الرمز، تحصل على بيانات المستخدم من API الخاص بالمزود


مثال على التكامل مع Google



لنستعرض مثالاً عملياً كاملاً للمصادقة عبر Google. أولاً، أنشئ مشروعاً في Google Cloud Console واحصل على Client ID وClient Secret.



هيكل الملفات:

  • config.php — إعدادات التطبيق
  • login.php — صفحة تسجيل الدخول
  • callback.php — معالج الرد من Google


config.php



<?php// إعدادات OAuth لـ Googledefine('GOOGLE_CLIENT_ID', 'your_client_id.apps.googleusercontent.com');define('GOOGLE_CLIENT_SECRET', 'your_client_secret');define('GOOGLE_REDIRECT_URI', 'https://your-site.com/callback.php');

// تضمين المكتبةrequire_once 'vendor/autoload.php';

use League\\OAuth2\\Client\\Provider\\Google;

// إنشاء المزود$provider = new Google([ 'clientId' => GOOGLE_CLIENT_ID, 'clientSecret' => GOOGLE_CLIENT_SECRET, 'redirectUri' => GOOGLE_REDIRECT_URI,]);?>


login.php



<?phprequire_once 'config.php';

// إنشاء URL للمصادقة$authUrl = $provider->getAuthorizationUrl([ 'scope' => ['email', 'profile'], // طلب البريد الإلكتروني والملف الشخصي]);

// حفظ state للحماية من هجمات CSRF$_SESSION['oauth2state'] = $provider->getState();

// توجيه المستخدمheader('Location: ' . $authUrl);exit;?>

<!-- بديل: زر على HTML --><a href="<?= htmlspecialchars($authUrl) ?>">تسجيل الدخول عبر Google</a>


callback.php



<?phprequire_once 'config.php';session_start();

// التحقق من وجود stateif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); exit('حالة غير صالحة');}

// الحصول على رمز الوصولtry { $accessToken = $provider->getAccessToken('authorization_code', [ 'code' => $_GET['code'] ]);

// الحصول على بيانات المستخدم $resourceOwner = $provider->getResourceOwner($accessToken); $userData = $resourceOwner->toArray();

// استخدام البيانات (مثال: حفظها في قاعدة البيانات) echo 'مرحباً، ' . htmlspecialchars($userData['name']); echo '<br>البريد الإلكتروني: ' . htmlspecialchars($userData['email']);

} catch (Exception $e) { exit('خطأ في المصادقة: ' . $e->getMessage());}?>


التكامل مع GitHub



للتكامل مع GitHub، ستحتاج إلى حزمة league/oauth2-github. الإعداد مشابه لـ Google، مع اختلافات في النطاقات (scopes) ونقاط النهاية (endpoints).



مثال على الإعداد لـ GitHub



<?phprequire_once 'vendor/autoload.php';

use League\\OAuth2\\Client\\Provider\\Github;

$provider = new Github([ 'clientId' => 'your_github_client_id', 'clientSecret' => 'your_github_client_secret', 'redirectUri' => 'https://your-site.com/callback-github.php',]);

// النطاقات المتاحة: 'user', 'repo', 'admin:org', إلخ.$authUrl = $provider->getAuthorizationUrl([ 'scope' => ['user:email']]);

$_SESSION['oauth2state'] = $provider->getState();header('Location: ' . $authUrl);?>


التكامل مع VK (VKontakte)



بالنسبة لـ VK، نستخدم حزمة غير رسمية digitalcloud/oauth2-vk. لاحظ أن VK يستخدم OAuth2 مع بعض الاختلافات.



مثال على الإعداد لـ VK



<?phprequire_once 'vendor/autoload.php';

use DigitalCloud\\OAuth2\\Client\\Provider\\VKontakte;

$provider = new VKontakte([ 'clientId' => 'your_vk_app_id', 'clientSecret' => 'your_vk_secure_key', 'redirectUri' => 'https://your-site.com/callback-vk.php',]);

// النطاقات (scopes) لـ VK: 'email', 'photos', 'friends', إلخ.$authUrl = $provider->getAuthorizationUrl([ 'scope' => ['email']]);

$_SESSION['oauth2state'] = $provider->getState();header('Location: ' . $authUrl);?>


أفضل الممارسات والأمان



  • استخدم HTTPS — جميع عمليات تبادل البيانات يجب أن تتم عبر اتصال آمن
  • تحقق من state — دائماً تحقق من معامل state للحماية من هجمات CSRF
  • قم بتخزين الرموز بشكل آمن — استخدم قاعدة بيانات مشفرة أو تخزين آمن للجلسات
  • حدد النطاقات (scopes) — اطلب فقط الأذونات التي تحتاجها حقاً
  • تعامل مع الأخطاء — أظهر رسائل خطأ مناسبة للمستخدمين
  • قم بتحديث المكتبات — حافظ على تحديث المكتبات للحصول على أحدث تصحيحات الأمان


الخلاصة



يوفر عميل OAuth لـ PHP باستخدام مكتبة League OAuth2 Client طريقة بسيطة وآمنة لدمج المصادقة عبر الخدمات الخارجية. باستخدام الأمثلة المذكورة أعلاه، يمكنك بسهولة إضافة تسجيل الدخول عبر Google وGitHub وVK إلى تطبيق PHP الخاص بك.



تذكر دائماً اتباع أفضل ممارسات الأمان واختبار التكامل بدقة قبل النشر في بيئة الإنتاج.



لمزيد من المعلومات، راجع الوثائق الرسمية لمكتبة League OAuth2 Client.

توصيات