Laravel Socialite

من موسوعة حسوب
مراجعة 14:24، 23 أكتوبر 2018 بواسطة رؤيا-بنعطية (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

مقدمة

بالإضافة إلى الاستيثاق النمطي القائم على النموذج، يوفر Laravel أيضًا طريقة بسيطة ومريحة للاستيثاق مع موفري OAuth باستخدام Laravel Socialite، وهو يدعم حاليا الاستيثاق مع Facebook و Twitter و LinkedIn وGoogle و GitHub و Bitbucket.

ملاحظة: المحولات للمنصات الأخرى موجودة في موقع مجتمع Socialite Providers.

التثبيت

استخدم Composer لإضافة الحزمة إلى اعتماديّات مشروعك لبدء استخدام Socialite:

composer require laravel/socialite

الضبط

ستحتاج قبل استخدام Socialite إلى إضافة بيانات اعتماد لخدمات OAuth التي يستخدمها تطبيقك في ملف الضبط config/services.php ويجب استخدام مفتاح Facebook، witter، Linkedin، Google، Github أو Bitbucket بالاعتماد على مقدمي الخدمات التي يتطلبها التطبيق، وهذا مثال على ذلك:

'github' => [
   'client_id' => env('GITHUB_CLIENT_ID'),        // معرّف Github العميل
   'client_secret' => env('GITHUB_CLIENT_SECRET'), // المعرّف السرّي لGitHub العميل  
   'redirect' => 'http://your-callback-url',
],

إذا احتوى خيار redirect على مسار نسبي، فستتحوّل تلقائيًا إلى عنوان URL مؤهل بالكامل.

التوجيه

أنت مستعد الآن لاستيثاق المستخدمين، ستحتاج إلى مسارين (route): أحدها لإعادة توجيه المستخدم إلى موفّر OAuth، والآخر لتلقي رد الاتصال من الموفّر بعد الاستيثاق، وسنصل إلى Socialite باستخدام واجهة Socialite:

<?php

namespace App\Http\Controllers\Auth;

use Socialite;

class LoginController extends Controller
{

   /**
    * إعادة توجيه المستخدم إلى صفحة مصادقة GIthub.
    *
    * @return \Illuminate\Http\Response
    */

   public function redirectToProvider()

   {
       return Socialite::driver('github')->redirect();
   }

   /**
    * الحصول على معلومات المستخدم من Github.
    *
    * @return \Illuminate\Http\Response
    */

   public function handleProviderCallback()

   {
      $user = Socialite::driver('github')->user();
      // $user->token;

   }
}

يهتم تابع redirect بإرسال المستخدم إلى موفّر OAuth، في حين سيقرأ تابع user الطلب الوارد وسيسترد معلومات المستخدم من الموفّر.

وبالطبع، ستحتاج إلى تعريف المسارات إلى توابع وحدات التحكم:

Route::get('login/github', 'Auth\LoginController@redirectToProvider');

Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');

معاملات اختياريّة

يدعم عدد من موفري OAuth العوامل الاختياريّة عند طلب إعادة التوجيه، ولتضمين أي معاملات اختياريّة في الطلب، استدع تابع with مع مصفوفة متصلة:

return Socialite::driver('google')

   ->with(['hd' => 'example.com'])

   ->redirect();

عند استخدام تابع with، احرص على عدم تمرير أي كلمات رئيسية محجوزة مثل state أو response_type.

نطاقات الوصول

يمكنك أيضًا إضافة "نطاقات" إضافيّة على الطلب باستخدام تابع scopes قبل إعادة توجيه المستخدم، وسيدمج هذا التابع جميع النطاقات الموجودة مع تلك التي توفرها:

return Socialite::driver('github')

   ->scopes(['read:user', 'public_repo'])
   ->redirect();

يمكنك استبدال جميع النطاقات الموجودة باستخدام التابع setScopes:

return Socialite::driver('github')

   ->setScopes(['read:user', 'public_repo'])
   ->redirect();

الاستيثاق عديم حالة

يمكن استخدام التابع stateless لتعطيل التحقق من حالة الجلسة، ويفيد هذا عند إضافة الاستيثاق الاجتماعي إلى واجهة:

return Socialite::driver('google')->stateless()->user();

استرداد تفاصيل المستخدم

بمجرد حصولك على نسخة من المستخدم، يمكنك الحصول على بعض التفاصيل حول المستخدم:

$user = Socialite::driver('github')->user();

// OAuth موفري

$token = $user->token;
$refreshToken = $user->refreshToken; // غير متوفّر دائمًا
$expiresIn = $user->expiresIn;

// OAuth موفر

$token = $user->token;
$tokenSecret = $user->tokenSecret;

// جميع الموفرين

$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();

استرداد تفاصيل المستخدم من رمز (OAuth2)

إذا كان لديك بالفعل رمز دخول لمستخدم، يمكنك استرداد تفاصيله باستخدام التابع userFromToken:

$user = Socialite::driver('github')->userFromToken($token);

استرداد تفاصيل المستخدم من رمز ورمز سري (OAuth1)

إذا كان لديك بالفعل زوج مميّز من الرمز/الرمز السري لمستخدم، فيمكنك استرداد التفاصيل الخاصة به باستخدام التابع userFromTokenAndSecret:

$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

مصادر