استخدام
Passport لإعداد خادوم Oauth على Laravel
لطالما وفّر إطار العمل
Laravel آليات سهلة للاستيثاق Authentication بالطرق التقليدية مثل استمارات Forms تسجيل الدخول في واجهة الوِب؛ إلا أن الأمر لم يكن سهلا بما فيه الكفاية بالنسبة للاستيثاق من الطلبات القادمة عبر واجهة تطبيقات برمجية. يأتي الإصدار 5.3 بحزمة جديدة، تُسمّى Passport، تهتم بتيسير
استخدام Laravel لضبط
خادوم Oauth وإعداده. يتناول هذا الدرس كيفية إعداد
Laravel ليوفّر وظيفة
خادوم Oauth اعتمادا على حزمة Passport.
laravel.png
خادوم Oauth
من المحتمل جدّا أنه سبق لك التعامل مع
خادوم Oauth؛ مثلا عند
استخدام حسابات على الشبكات الاجتماعية (فيس بوك، تويتر، … إلخ) للتسجيل في موقع على الشبكة. الفكرة التي تنبني عليها آلية الاستيثاق هذه هي تفويض عمليّة الاستيثاق إلى
خادوم Oauth. نفترض مثلا أن لديك موقعا يستخدم هذه الآلية؛ عند تسجيل دخول الموقع عن طريق الحساب على فيس بوك فإن ما يحدُث هو التالي:
يلج المستخدم إلى الموقع ويختار طريقة تسجيل الدخول (فيس بوك).
يُنقَل المستخدم إلى صفحة تسجيل الدخول في فيس بوك حيثُ يُطلَب منه تسجيل الدخول إن لم يكن سبق له ذلك ثم يؤكّد سماحه لموقعك باستخدام حسابه على فيس بوك.
يُعاد توجيه المستخدم إلى الموقع مع تسجيل دخوله إليه.
يفترض هذا الدرس أن لديك إلماما بكيفية عمل خواديم
Oauth للتصريح بالدخول. يمكن الاطّلاع على مقال مدخل إلى
Oauth 2 للمزيد عن هذا الموضوع. إن كنتَ تبحث عن كيفية تسجيل الدخول إلى تطبيقك باستخدام حساب على موقع يوفّر وظيفة
Oauth فراجع درس تسجيل الدخول عبر الشبكات الاجتماعية في
Laravel باستخدام Socialite.
إعداد
خادوم Oauth على
Laravel 5.3
يحتاج إعداد
Passport على
Laravel لتنفيذ بضعة أوامر وتحرير ملفات إعداد؛ إلا أن العملية عموما سهلة. ابدأ بتثبيت الإصدار 5.3 من Laravel:
composer create-project --prefer-dist laravel/laravel laravel53oauth "5.3.*"
نستخدم composer لإضافة حزمة
Passport إلى متطلبات المشروع:
composer require laravel/passport
نسجّل مزوّد الخدمة
Passport في ملفّ الإعداد config/app.php. افتح الملف ثم أضف السطر التالي إلى مصفوفة providers:
Laravel\Passport\PassportServiceProvider::class,
تأكّد من إعدادات قاعدة البيانات ثمّ نفّذ أمر التهجير Migration التالي:
php artisan migrate
ستلاحظ تنفيذ تهجيرات إضافية علاوة على تلك التي تأتي مبدئيّا مع Laravel:
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2016_06_01_000001_create_oauth_auth_codes_table
Migrated: 2016_06_01_000002_create_oauth_access_tokens_table
Migrated: 2016_06_01_000003_create_oauth_refresh_tokens_tabl e
Migrated: 2016_06_01_000004_create_oauth_clients_table
Migrated: 2016_06_01_000005_create_oauth_personal_access_cli ents_table
يأتي مزوّد الخدمة
Passport مع تهجيرات لإنشاء جداول تخزّن عملاء Client التطبيق ومعلومات رموز الوصول Access tokens. ثم ننفّذ الأمر التالي الذي سيولّد مفاتيح التعميّة Encryption keys الخاصّة بمشروع كما أنه ينشئ رموز الوصول ويخزّنها في جدول البيانات المناسب:
php artisan passport:install
ننتقل الآن إلى نموذج المستخدم User ونضيف إليه السّمة Trait المسمّاة HasApiTokens. يُصبح النموذج على النحو التالي (بعد نزع التعليقات للاختصار):
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
// استيراد السّمة
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
//
استخدام السمة
use HasApiTokens, Notifiable;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
}
توفّر هذه السّمة مجموعة من الدوال المساعدة التي تتيح الحصول على رموز الوصول الخاصّة بالمستخدمين ومدى الصلاحيّات Permissions scope المتاح للعميل.
الخطوة المواليّة هي استدعاء الدالة Passport::routes ضمن الدالة boot الموجودة في مزوّد خدمة الاستيثاق app/Providers/AuthServiceProvider.php:
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
لا تنس استدعاء الصنف Laravel\Passport\Passport في مزوّد خدمة الاستيثاق:
use Laravel\Passport\Passport;
يمكنك ملاحظة المسارات الجديدة التي أضافتها الدالة Passport::routes بتنفيذ أمر Artisan التالي الذي يسرُد لائحة بالمسارات الموجودة في المشروع:
php artisan route:list
الخطوة الأخيرة هي تعديل ملف الإعداد config/auth.php وتحديد قيمة driver في المصفوفة api لتصبح
Passport بدلا من token:
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
يعتمد
Laravel مبدئيا على رموز للاستيثاق من الطلبات القادمة عبر واجهة التطبيقات البرمجية؛ إلا أن هذه الرموز المبدئية لا تتيح إلا القليل من الخيارات، عكس ما يوفّره Passport.
بهذا نكون أنهينا إعداد
Laravel لأداء وظيفة
خادوم Oauth.
اختبار
خادوم Oauth
المرحلة المواليّة بعد إعداد
Laravel ليعمل
خادوم Oauth هي اختبار ما أعددناه. سنحتاج لعميل نجرّب عن طريقه الاستيثاق من الخادوم. نعيد النظر، قبل الانتقال للجانب التطبيقي من الاختبار، في كيفية الاستيثاق من مستخدم في
خادوم Oauth.
تضمّ العمليّة ثلاثة أطراف: المستخدِم، الخادوم والعميل. يريد المستخدِم تسجيل الدخول إلى العميل بالاعتماد على معلوماته الموجودة في الخادوم:
ينقُل العميل المستخدِم إلى صفحة تسجيل الدخول على الخادوم.
يُسجّل المستخدم الدخول إلى حسابه على الخادوم عن طريق بريده الإلكتروني وكلمة السّر.
يتحقّق الخادوم من بيانات المستخدِم، ثم ينشئ - إذا كانت البيانات صحيحة - رمز وصول خاصًّا بالمستخدِم ويعيده إلى العميل.
يستعمل العميل رمز الوصول الذي أرسله إليه الخادوم في طلباته المقبلة للتدليل على أن المستخدم فوّضه التعامل باسمه مع الخادوم.
إنشاء مستخدمين للاختبار
نبدأ بإنشاء مستخدمين لتجربة الاستيثاق. ننفذ أمر Artisan التالي لإنشاء صنف بذر Seed جديد:
php artisan make:seeder UsersTableSeeder
ثم نعدّل الدالة run لإنشاء مستخدمَيْن جديديْن:
public function run()
{
$user1 = [
'name' => 'Med Ahmed Eyil',
'email' => 'medeyil@laravel.com',
'password' => Hash::make('1234'),
];
$user2 = [
'name' => 'Fatima Benziane',
'email' => 'fbenziane@laravel.com',
'password' => Hash::make('4567'),
];
User::create($user1);
User::create($user2);
}
لا تنس استيراد النموذج User:
use App\User;
ثم نعتمد صنف البذر بتعديل الدالة run في الصنف DatabaseSeeder:
public function run()
{
$this->call(UsersTableSeeder::class);
}
ثم ننفذ أمر البذر:
php artisan db:seed
جهّزنا الآن طرفيْن من الأطراف الثلاثة التي تحدثنا عنها، بقي العميل.
إعداد العميل
يوفّر
Laravel بواسطة
Passport مسارات من بينها المسار oauth/token/ الذي يمكّن من الحصول على رمز وصول. ينتظر المسار المعطيَات التاليّة:
طريقة منح الصلاحيّة grant_type.
معرّف المستخدم client_id.
عبارة سر العميل client_secret.
يحدّد المعطى grant_type طريقةَ توليد رموز الوصول. بما أننا نريد أن يطلُب الخادوم من المستخدم بريده الإلكتروني وكلمة السّر لكي يولّد رمز وصول للتطبيق العميل، فإن هذا المعطى سيأخذ القيمة password. يمكن لهذا المعطى أن يأخذ قيما أخرى حسب الطريقة التي تريد للتطبيقات العميلة أن تصل بها إلى موارد محميّة على خادومك. يعيّن المعطى الثاني معرّف العميل الذي نريد الاستيثاق منه؛ أما عبارة السّر فمهمتها إثبات أن العميل لديه ترخيص للاستيثاق بخادوم
Oauth الذي أعددناه. سنحتاج أيضا لتمرير بريد المستخدم الإلكتروني وكلمة سره، بما أننا اخترنا طريقة password لتوليد الرموز.
نعود لمشروع
Laravel حيث يوجد الخادوم ثم ننفذ الأمر التالي:
php artisan passport:client --password
What should we name the password grant client? [Laravel Password Grant Client]:
> Academy Password Client
Password grant client created successfully.
Client ID: 3
Client Secret: 17ZNjWn5A1I3mYOhGXZQFNACTdyt9Nwxup9jXG4M
يطلُب الأمر أعلاه إنشاء تصريح لعميل للاستيثاق بخادوم
Oauth ويحدّد طريقة توليد رموز الوصول بـpassword. يطلُب الأمر اسمًا للعميل ثم بعد كتابته وتأكيده يمنحنا معرّفا للعميل وعبارة سرّ.
ملحوظة: رمز الوصول المولَّد فريد Unique، القيمة التي ستظهر لديك مختلفة حتما عن القيمة الظاهرة هنا.
نعرّج قليلا، قبل الانتقال إلى العميل، على قاعدة البيانات وننظر في الجدول oauth_clients.
01_oauth_clients.png
لاحظ في الجدول وجود العميل الذي أنشأناه للتو، إضافة إلى عميليْن آخرين؛ أنشأهما الأمر passport:install عندما نفّذناه. تمكن ملاحظة أن قيمة العمود password_client بالنسبة للعميل الذي أنشأناه هي 1 للدلالة على أنه من نوع password.