دليل شامل لمصادقة Laravel

نشرت: 2023-03-23

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

يمكنك تنفيذ ميزات مصادقة Laravel بسرعة وأمان. ومع ذلك ، فإن تنفيذ ميزات المصادقة هذه بشكل سيئ يمكن أن يكون محفوفًا بالمخاطر ، حيث يمكن للأطراف الخبيثة استغلالها.

سيعلمك هذا الدليل كل ما تحتاج إلى معرفته لبدء طرق مصادقة Laravel التي اخترتها.

واصل القراءة!

مقدمة عن مصادقة Laravel

يقدم Laravel وحدات مكونة من "الحراس" و "الموفرين". تحدد الحراس مصادقة المستخدم لكل طلب ، ويحدد المزودون استرجاع المستخدم من التخزين الدائم (مثل قاعدة بيانات MySQL).

نحدد معلمات المصادقة الخاصة بنا في ملف يسمى config/auth.php . يتضمن العديد من الخيارات لتعديل وتعديل سلوك مصادقة Laravel.

أولاً ، عليك تحديد إعدادات المصادقة الافتراضية. يتحكم هذا الخيار في خيارات المصادقة الافتراضية "guard" الخاصة بالتطبيق وخيارات إعادة تعيين كلمة المرور. يمكنك تغيير هذه الإعدادات الافتراضية كما هو مطلوب ، لكنها بداية مثالية لمعظم التطبيقات.

بعد ذلك ، يمكنك تحديد حراس المصادقة لتطبيقك. هنا ، يستخدم التكوين الافتراضي الخاص بنا تخزين الجلسة وموفر مستخدم Eloquent. جميع برامج تشغيل المصادقة لها مزود مستخدم.

 return [ /* Defining Authentication Defaults */ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], /* Defining Authentication Guards Supported: "session" */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], /* Defining User Providers Supported: "database", "eloquent" */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], /* Defining Password Resetting */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], /* Defining Password Confirmation Timeout */ 'password_timeout' => 10800, ];

لاحقًا ، نتأكد من أن جميع برامج تشغيل المصادقة لديها مزود مستخدم. يحدد هذا كيفية استرداد المستخدمين من قاعدة البيانات الخاصة بك أو من آليات التخزين الأخرى لاستمرار بيانات المستخدم الخاصة بك. يمكنك تكوين مصادر متعددة تمثل كل نموذج أو جدول إذا كان لديك عدة جداول أو نماذج مستخدمين. قد يتم تعيين هذه المصادر لأي حراس مصادقة إضافيين قمت بتحديدهم.

قد يرغب المستخدمون أيضًا في إعادة تعيين كلمات المرور الخاصة بهم. لهذا ، يمكنك تحديد تكوينات متعددة لإعادة تعيين كلمة المرور إذا كان لديك أكثر من جدول أو نموذج مستخدم واحد في التطبيق وتريد إعدادات منفصلة بناءً على أنواع المستخدمين المحددة. وقت انتهاء الصلاحية هو عدد الدقائق التي سيكون كل رمز مميز لإعادة تعيينها صالحًا. تعمل ميزة الأمان هذه على إبقاء الرموز المميزة قصيرة الأجل ، بحيث يكون لديها وقت أقل للتخمين. يمكنك تغيير هذا حسب الحاجة.

في النهاية ، يجب عليك تحديد الوقت قبل انتهاء مهلة تأكيد كلمة المرور ، ويُطلب من المستخدم إعادة إدخال كلمة المرور الخاصة به عبر شاشة التأكيد. بشكل افتراضي ، تستمر المهلة لمدة ثلاث ساعات.

أنواع طرق مصادقة Laravel

لا توجد طريقة مثالية لمصادقة كل سيناريو ، ولكن معرفتها ستساعدك على اتخاذ قرارات أفضل. هذا وكيف يتطور Laravel مع الميزات الجديدة في Laravel 9. وهذا يجعل مهمتنا كمطورين أسهل بكثير عند تبديل أوضاع المصادقة.

المصادقة القائمة على كلمة المرور

كطريقة أولية لمصادقة المستخدم ، لا تزال تستخدمه آلاف المنظمات ، ولكن بالنظر إلى التطور الحالي ، فمن الواضح أنها أصبحت قديمة.

يجب على البائعين فرض تطبيقات معقدة لكلمات المرور مع ضمان الحد الأدنى من الاحتكاك للمستخدم النهائي.

إنه يعمل بشكل مباشر للغاية ، حيث يقوم المستخدم بإدخال الاسم وكلمة المرور ، وإذا كان هناك تطابق بين هذين الاثنين في قاعدة البيانات ، يقرر الخادم مصادقة الطلب والسماح للمستخدم بالوصول إلى الموارد لفترة محددة مسبقًا.

المصادقة القائمة على الرمز

يتم استخدام هذه المنهجية حيث يتم إصدار رمز مميز فريد للمستخدم عند التحقق.

بوجود هذا الرمز المميز ، يمكن للمستخدم الآن الوصول إلى الموارد ذات الصلة. الامتياز نشط حتى تنتهي صلاحية الرمز المميز.

أثناء تنشيط الرمز المميز ، لا يتعين على المستخدم استخدام أي اسم مستخدم أو كلمة مرور ، ولكن عند استرداد رمز مميز جديد ، يلزم استخدام هذين الرمزين.

تُستخدم الرموز على نطاق واسع في سيناريوهات متعددة اليوم لأنها كيانات عديمة الحالة تحتوي على جميع بيانات المصادقة.

يوفر توفير طريقة لفصل إنشاء الرمز المميز عن التحقق من الرمز المميز للبائعين مرونة كبيرة.

مصادقة متعددة العوامل

كما يوحي الاسم ، فإنه يعني استخدام عاملي مصادقة على الأقل ، مما يرفع مستوى الأمان الذي يوفره.

على عكس المصادقة ذات العاملين التي تتضمن عاملين فقط ، يمكن أن تتضمن هذه الطريقة عاملين ، ثلاثة ، أربعة ، وأكثر ...

يتضمن التنفيذ النموذجي لهذه الطريقة استخدام كلمة مرور ، وبعد ذلك يتم إرسال رمز تحقق للمستخدم على هاتفه الذكي. يجب أن يبحث البائعون الذين يطبقون هذه الطريقة عن الإيجابيات الخاطئة وانقطاعات الشبكة ، والتي يمكن أن تصبح مشكلات كبيرة أثناء التوسع السريع.

كيفية تنفيذ مصادقة Laravel

سيعلمك هذا القسم عدة طرق لمصادقة مستخدمي التطبيق الخاص بك. تحتوي بعض المكتبات مثل Jetstream و Breeze و Socialite على دروس مجانية حول كيفية استخدامها.

المصادقة اليدوية

البدء بتسجيل المستخدمين وإنشاء المسارات المطلوبة في routes/web.php .

سننشئ طريقين ، أحدهما لعرض النموذج والآخر للتسجيل:

 use App\Http\Contrllers\Auth\RegisterController; use Illuminate\Support\Facades\Route; /* Web Routes Register web routes for your app's RouteServiceProvider in a group containing the "web" middleware */ Route::get('/register', [RegisterController::class], 'create']); Route::post('/register', [RegisterController::class], 'store']);

وأنشئ وحدة التحكم اللازمة لأولئك:

 php artisan make controller Auth/RegisterController -r

الآن قم بتحديث الكود كما يلي:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use illuminate\Htpp\Request; class RegisterController extends Controller { public function create() { return view('auth.register'); } public function store(Request $request) { } }

وحدة التحكم فارغة الآن وتعيد عرضًا للتسجيل. دعونا نجعل هذا العرض في resources/views/auth ونسميها register.blade.php .

عرض شفرة Laravel لتسجيل المستخدمين.
عرض شفرة Laravel لتسجيل المستخدمين.

الآن مع وجود كل شيء في مكانه ، يجب أن نزور مسارنا /register ونرى النموذج التالي:

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' => 'The provided credentials do not match our records.', ]); }

الآن بعد أن أصبح بإمكاننا عرض نموذج يمكن للمستخدم إكماله والحصول على البيانات الخاصة به ، يجب أن نحصل على بيانات المستخدمين ، والتحقق من صحتها ، ثم تخزينها في قاعدة البيانات إذا كان كل شيء على ما يرام. هنا يجب عليك استخدام معاملة قاعدة البيانات للتأكد من اكتمال البيانات التي تدخلها.

سنستخدم ميزة التحقق من صحة الطلب في Laravel للتأكد من أن بيانات الاعتماد الثلاثة جميعها مطلوبة. يجب أن نتأكد من أن البريد الإلكتروني يحتوي على تنسيق بريد إلكتروني وأنه فريد في جدول users وأن كلمة المرور مؤكدة وتحتوي على 8 أحرف على الأقل:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return back(); } public function create() { return view('auth.register'); } }

الآن بعد أن تم التحقق من صحة المدخلات الخاصة بنا ، فإن أي شيء يتعارض مع التحقق من الصحة سيؤدي إلى ظهور خطأ سيتم عرضه في النموذج:

مثال على إدخال غير صالح للتسجيل
مثال على إدخال غير صالح للتسجيل

بافتراض أننا أنشأنا حساب مستخدم في طريقة store ، فإننا نريد أيضًا تسجيل دخول المستخدم. هناك طريقتان يمكننا من خلالها القيام بذلك. يمكننا القيام بذلك يدويًا أو استخدام واجهة Auth .

بعد أن يقوم المستخدم بتسجيل الدخول ، يجب ألا نعيده إلى شاشة التسجيل ولكن بدلاً من ذلك إلى صفحة جديدة ، مثل لوحة القيادة أو الصفحة الرئيسية. هذا ما سنفعله هنا:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); Auth::login($user): return redirect(RouteServiceProvider::HOME); } public function create() { return view('auth.register'); } }

والآن بعد أن أصبح لدينا مستخدم مسجل وسجل -n ، يجب أن نتأكد من أنه يمكنه تسجيل الخروج بأمان.

يقترح Laravel أننا نبطل الجلسة ونعيد إنشاء الرمز المميز للأمان بعد تسجيل الخروج. وهذا بالضبط ما سنفعله. نبدأ بإنشاء مسار جديد /logout باستخدام طريقة destroy LogoutController :

 use App\Http\Controllers\Auth\RegisterController; use App\Http\Controllers\Auth\LogoutController; use Illuminate\Support\Facades\Route; /* Web Routes Here is where you can register web routes for your application. These routes are loaded by the RrouteServiceProvider with a group which contains the "web" middleware group. Now create something great! */ Route::get('/register', [RegisterController::class, 'create']); Route::post('/register', ['RegisterController::class, 'store']); Route::post('/logout', [Logoutcontroller::class, 'destroy']) ->middleware('auth');

يعد تمرير تسجيل الخروج عبر البرنامج الوسيط "auth" أمرًا في غاية الأهمية. يجب ألا يتمكن المستخدمون من الوصول إلى المسار إذا لم يقوموا بتسجيل الدخول.

الآن ، قم بإنشاء وحدة تحكم كما فعلنا من قبل:

 php artisan make:controller Auth/LogoutController -r

يمكننا التأكد من حصولنا على الطلب كمعامل في طريقة destroy . نقوم بتسجيل خروج المستخدم من خلال واجهة Auth ، ونبطل الجلسة ، ونعيد إنشاء الرمز المميز ، ثم نعيد توجيه المستخدم إلى الصفحة الرئيسية:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LogoutController extends Controller { public function destroy(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } }

تذكر المستخدمين

توفر معظم تطبيقات الويب الحديثة ، إن لم يكن كلها ، مربع اختيار "تذكرني" في نموذج تسجيل الدخول.

إذا أردنا توفير وظيفة "تذكرني" ، فقد نقوم بتمرير قيمة منطقية كمعامل ثاني إلى طريقة المحاولة.

عندما يكون صالحًا ، سيبقي Laravel المستخدم مصادقًا إلى أجل غير مسمى أو حتى يتم تسجيل الخروج يدويًا. يجب أن يشتمل جدول المستخدم على العمود remember_token (لهذا السبب نقوم بإعادة إنشاء الرموز) ، حيث سنخزن الرمز المميز "تذكرني".

الترحيل الافتراضي للمستخدمين يتضمنه بالفعل.

أول الأشياء أولاً ، عليك إضافة حقل تذكرني إلى النموذج الخاص بك:

تذكرني في النموذج الميداني
مضيفا تذكرني المجال من.

وبعد ذلك ، احصل على بيانات الاعتماد من الطلب واستخدمها في طريقة المحاولة على واجهة Auth.

إذا كان يجب تذكر المستخدم ، فسنقوم بتسجيل الدخول وإعادة توجيهه إلى صفحتنا الرئيسية. خلاف ذلك ، سوف نخطئ:

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' =>

إعادة تعيين كلمات المرور

توفر معظم تطبيقات الويب اليوم طرقًا للمستخدمين لإعادة تعيين كلمات المرور الخاصة بهم.

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

 Route::post('/forgot-password', [ForgotPasswordLinkController::class, 'store']); Route::post('/forgot-password/{token}', [ForgotPasswordController::class, 'reset']);

داخل طريقة المتجر ، سنأخذ البريد الإلكتروني من الطلب ونتحقق من صحته كما فعلنا.

بعد ذلك ، يمكننا استخدام طريقة sendResetLink من واجهة كلمة المرور.

وبعد ذلك ، وكرد فعل ، نريد إعادة الحالة إذا نجحت في إرسال الرابط أو الأخطاء بخلاف ذلك:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Password; class ForgotPasswordLinkController extends Controller { public function store(Request $request) { $request->validate([ 'email' => 'required|email', ]); $status = Password::sendResetLink( $request->only('email'); ); return $status === Password::RESET_LINK_SENT ? back()->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

الآن بعد أن تم إرسال رابط إعادة التعيين إلى البريد الإلكتروني للمستخدم ، يجب علينا الاهتمام بمنطق ما يحدث بعد ذلك.

سوف نحصل على الرمز المميز والبريد الإلكتروني وكلمة المرور الجديدة في الطلب ونتحقق من صحتها.

بعد ذلك ، يمكننا استخدام طريقة إعادة الضبط من واجهة كلمة المرور للسماح لـ Laravel بالعناية بكل شيء آخر خلف الكواليس.

سنقوم دائمًا بتجزئة كلمة المرور لإبقائها آمنة.

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

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Password; use Illuminate\Support\Str; class ForgotPasswordController extends Controller { public function store(Request $request) { $request->validate([ 'token' => 'required', 'email' => 'required|email', 'password' => 'required|string|confirmed|min:8', ]); $status = Password::reset( $request->only('email', 'password', 'password_confirmation', 'token'), function ($user) use ($request) { $user->forceFill( 'password' => Hash::make($request->password), 'remember_token' => Str::random(60) ])->save(); } ); return $status == Password::PASSWORD_RESET ? redirect()->route('login')->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

Laravel Breeze. لارافيل بريز

Laravel Breeze هو تنفيذ بسيط لميزات مصادقة Laravel: تسجيل الدخول ، التسجيل ، إعادة تعيين كلمة المرور ، التحقق من البريد الإلكتروني ، وتأكيد كلمة المرور. يمكنك استخدامه لتنفيذ المصادقة في تطبيق Laravel الجديد.

التثبيت والإعداد

بعد إنشاء تطبيق Laravel الخاص بك ، كل ما عليك فعله هو تكوين قاعدة البيانات الخاصة بك وتشغيل عمليات الترحيل وتثبيت حزمة laravel / breeze من خلال composer:

 composer require laravel/breeze –dev

بعد ذلك ، قم بتشغيل ما يلي:

 php artisan breeze:install

والتي ستنشر طرق عرض المصادقة والمسارات ووحدات التحكم والموارد الأخرى التي تستخدمها. بعد هذه الخطوة ، ستتمتع بالتحكم الكامل في كل ما يوفره Breeze.

الآن يتعين علينا تقديم تطبيقنا إلى الواجهة الأمامية ، لذلك سنقوم بتثبيت تبعيات JS (والتي ستستخدمvite):

 npm install

:

 npm run dev

بعد ذلك ، يجب أن تكون روابط تسجيل الدخول والتسجيل على صفحتك الرئيسية ، ويجب أن يعمل كل شيء بسلاسة.

Laravel Jetstream

يقوم Laravel Jetstream بتوسيع Laravel Breeze بميزات مفيدة وحزم أمامية أخرى.

يوفر تسجيل الدخول والتسجيل والتحقق من البريد الإلكتروني والمصادقة الثنائية وإدارة الجلسة ودعم واجهة برمجة التطبيقات عبر Sanctum وإدارة الفريق الاختيارية.

يجب عليك الاختيار بين Livewire و Inertia على الواجهة الأمامية عند تثبيت Jetstream. في الواجهة الخلفية ، يستخدم Laravel Fortify ، وهو واجهة مصادقة غير محددة للواجهة الأمامية ، "بلا رأس" ، خلفية مصادقة لـ Laravel.

التثبيت والإعداد

سنقوم بتثبيته من خلال الملحن في مشروع Laravel الخاص بنا:

 composer require laravel/jetstream

بعد ذلك ، سنقوم بتشغيل الأمر php artisan jetstream:install [stack] والذي يقبل وسيطات [stack] Livewire أو Inertia . يمكنك تمرير الخيار –team لتمكين ميزة الفرق.

سيؤدي هذا أيضًا إلى تثبيت Pest PHP للاختبار.

وأخيرًا ، يتعين علينا تقديم الواجهة الأمامية لتطبيقنا باستخدام ما يلي:

 npm install npm run dev

حصن Laravel

Laravel Fortify هو تطبيق مصادقة للواجهة الخلفية غير مألوف للواجهة الأمامية. ليس عليك استخدام Laravel Fortify لتنفيذ ميزات مصادقة Laravel.

يتم استخدامه أيضًا في مجموعات بدء التشغيل مثل Breeze و Jetstream. يمكنك أيضًا استخدام Fortify مستقل ، وهو مجرد تطبيق للواجهة الخلفية. إذا كنت تستخدمه بشكل مستقل ، فيجب أن تستدعي الواجهة الأمامية مسارات Fortify.

التثبيت والإعداد

يمكننا تثبيت Fortify من خلال الملحن:

 composer require laravel/fortify

الآن علينا نشر موارد Fortify:

 php artisan vendor:publish –provider="Laravel\Fortify\FortifyServiceProvider"

بعد ذلك ، سننشئ دليل تطبيقات / إجراءات جديدًا بالإضافة إلى FortifyServiceProvider الجديد وملف التكوين وترحيلات قاعدة البيانات.

أخيرًا ، قم بتشغيل:

 php artisan migrate

أو:

 php artisan migrate:fresh

و Fortify الخاص بك جاهز للاستخدام.

Laravel Socialite

يتضمن Laravel ميزة مصادقة مستخدم مبنية على بروتوكول OAuth. وهو يدعم عمليات تسجيل الدخول الاجتماعية عبر Facebook و Twitter و LinkedIn و Google و Bitbucket و GitHub و GitLab.

تثبيت

يمكننا تثبيته من خلال الملحن:

 composer require laravel/socialite

الإعداد والاستخدام

بعد تثبيته ، يتعين علينا إضافة بيانات اعتماد موفر OAuth الذي يستخدمه تطبيقنا. سنضيفهم في config / services.php لكل خدمة.

في التكوين ، يجب أن نطابق المفتاح مع الخدمات السابقة. بعض هذه المفاتيح تشمل:

  • فيسبوك
  • twitter (لـ OAuth 1.0)
  • twitter-oauth-2 (لـ OAuth 2.0)
  • ينكدين
  • جوجل
  • جيثب
  • جيتلاب
  • bitbucket

قد يبدو تكوين خدمة واحد كما يلي:

 'google' => [ 'client_id' => env("GOOGLE_CLIENT_ID"), 'client_secret' => env("GOOGLE_CLIENT_SECRET"), 'redirect' => "http://example.com/callback-url", ],

مصادقة المستخدمين

لهذا الإجراء ، سنحتاج إلى مسارين ، أحدهما لإعادة توجيه المستخدم إلى موفر OAuth:

 use Laravel\Socialite\Facades\Sociliate; Route::get('/auth/redirect', function () { return Socialite:;driver('google')->redirect(); });

وواحد لمعاودة الاتصال من المزود بعد المصادقة:

 use Laravel\Socialite\Facades\Socialite; Route:;get('/auht/callback', function () { $user = Socialite:;driver('google')->user(); // Getting the user data $user->token; });

يوفر Socialite طريقة إعادة التوجيه ، وتقوم الواجهة بإعادة توجيه المستخدم إلى موفر OAuth ، بينما تقوم طريقة المستخدم بفحص الطلب الوارد واسترداد معلومات المستخدم.

بعد أن نتلقى المستخدم الخاص بنا ، يتعين علينا التحقق مما إذا كان موجودًا في قاعدة البيانات الخاصة بنا والمصادقة عليه. إذا لم يكن موجودًا ، فسننشئ سجلًا جديدًا لتمثيل المستخدم:

 use App\Models\User; use Illuminate\Support\Facades\Auth; use Laravel\Socialite\Facades\Socialite; Route::get('/auth/callback', function () { /* Get the user */ $googleUser = Socialite::driver('google')->user(); /* Create the user if it does not exist Update the user if it exists Check for google_id in database */ $user = User::updateOrCreate([ 'google_id' => $googleUser->id, ], [ 'name' => $googleUser->name, 'email' => $googleUser->email, 'google_token' => $googleUser->token, 'google_refresh_token' => $googleUser->refreshToken, ]); /* Authenticates the user using the Auth facade */ Auth::login($user); return redirect('/dashboard'); });

إذا أردنا تقييد نطاقات وصول المستخدم ، فقد نستخدم طريقة scopes ، والتي سنقوم بتضمينها مع طلب المصادقة. سيؤدي هذا إلى دمج جميع النطاقات المحددة مسبقًا مع النطاقات المحددة.

بديل لهذا هو استخدام طريقة setScopes التي تحل محل كل نطاق آخر موجود:

 use Laravel\Socialite\Facades\Socialite; return Socialite::driver('google') ->scopes(['read:user', 'write:user', 'public_repo']) ->redirect(); return Socialite::driver('google') ->setScopes(['read:user', 'public_repo') ->redirect();

الآن بعد أن عرفنا كل شيء وكيفية الحصول على مستخدم بعد رد الاتصال ، دعنا نلقي نظرة على بعض البيانات التي يمكننا الحصول عليها منه.

مستخدم OAuth1 لديه token tokenSecret :

 $user = Socialite::driver('google')->user(); $token = $user->token; $tokenSecret = $user->tokenSecret;

يوفر OAuth2 token ، و refreshToken ، و expiresIn :

 $user = Socialite::driver('google')->user(); $token = $user->token; $refreshToken = $user->refreshToken; $expiresIn = $user->expiresIn;

يوفر كل من OAuth1 و OAuth2 getId و getNickname و getName و getEmail و getAvatar :

 $user = Socialite::driver('google')->user(); $user->getId(); $user->getNickName(); $user->getName(); $user->getEmail(); $user->getAvatar();

وإذا أردنا الحصول على تفاصيل المستخدم من رمز (OAuth 2) أو رمز مميز وسر (OAuth 1) ، فإن sanctum يوفر طريقتين لهذا: userFromToken و userFromTokenAndSecret :

 use Laravel\Socialite\Facades\Socialite; $user = Socialite:;driver('google')->userFromToken($token); $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

Laravel Sanctum

Laravel Sanctum هو نظام مصادقة خفيف لـ SPA (تطبيقات الصفحة الواحدة) وتطبيقات الأجهزة المحمولة. يتيح للمستخدمين إنشاء العديد من الرموز المميزة لواجهة برمجة التطبيقات بنطاقات محددة. تحدد هذه النطاقات الإجراءات المسموح بها بواسطة الرمز المميز.

الأعراف

يمكن استخدام Sanctum لإصدار رموز API للمستخدم بدون تعقيدات OAuth. عادةً ما يكون لهذه الرموز المميزة فترات انتهاء صلاحية طويلة ، مثل السنوات ، ولكن قد يتم إبطالها وإعادة إنشائها من قبل المستخدم في أي وقت.

التثبيت والإعداد

يمكننا تثبيته عبر الملحن:

 composer require laravel/sanctum

وعلينا نشر ملفات التكوين والترحيل:

 php artisan vendor:publish –provider="Laravel\Sanctum\SanctumServiceProvider"

الآن بعد أن أنشأنا ملفات ترحيل جديدة ، يتعين علينا ترحيلها:

 php artisan migrate </code> or <code> php artisan migrate:fresh

كيفية إصدار رموز API

قبل إصدار الرموز ، يجب أن يستخدم نموذج المستخدم الخاص بنا سمة Laravel \ Sanctum \ HasApiTokens :

 use Laravel\Sanctum\HasApiTokens; class User extends Authenticable { use HasApiTokens; }

عندما يكون لدينا المستخدم ، يمكننا إصدار رمز مميز عن طريق استدعاء طريقة createToken ، والتي تُرجع مثيل Laravel \ Sanctum \ NewAccessToken .

يمكننا استدعاء طريقة plainTextToken على مثيل NewAccessToken لرؤية قيمة النص العادي SHA-256 للرمز المميز.

نصائح وأفضل الممارسات لمصادقة Laravel

إبطال الجلسات على الأجهزة الأخرى

كما ناقشنا سابقًا ، يعد إبطال الجلسة أمرًا بالغ الأهمية عند تسجيل خروج المستخدم ، ولكن يجب أن يكون ذلك متاحًا أيضًا كخيار لجميع الأجهزة المملوكة.

تُستخدم هذه الميزة عادةً عندما يغير المستخدم كلمة المرور الخاصة به أو يحدّثها ، ونريد إبطال جلسته من أي جهاز آخر.

نظرًا لوجود واجهة Auth ، تعد هذه مهمة سهلة التحقيق. بالنظر إلى أن المسار الذي نستخدمه يحتوي على برمجية وسيطة auth و auth.session middleware ، يمكننا استخدام طريقة logoutOtherDevices الثابتة للواجهة:

 Route::get('/logout', [LogoutController::class, 'invoke']) ->middleware(['auth', 'auth.session']);
 use Illuminate\Support\Facades\Auth; Auth::logoutOtherDevices($password);

التكوين باستخدام المصادقة :: المسارات ()

طريقة المسارات لواجهة Auth هي مجرد مساعد لتوليد جميع المسارات المطلوبة لمصادقة المستخدم.

تشمل المسارات تسجيل الدخول (الحصول عليها ونشرها) وتسجيل الخروج (النشر) والتسجيل (الحصول عليها ونشرها) وإعادة تعيين كلمة المرور / البريد الإلكتروني (الحصول عليها ونشرها).

عندما تستدعي الطريقة على الواجهة ، فإنها تقوم بما يلي:

 public static fucntion routes(array $options = []) { if (!static::$app->providerIsLoaded(UiServiceProvider::class)) { throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel/ui package.'); } static::$app->make('router')->auth($options); }

نحن مهتمون بما يحدث عندما يتم استدعاء الطريقة الثابتة على جهاز التوجيه. قد يكون هذا أمرًا صعبًا نظرًا لحقيقة كيفية عمل الواجهات ، ولكن الطريقة التالية تسمى هكذا:

 /** Register the typical authentication routes for an application. @param array $options @return void */ public function auth(array $options = []) { // Authentication Routes... $this->get('login', 'Auth\[email protected]')->name('login'); $this->post('login', 'Auth\[email protected]'); $this->post('logout', 'Auth\[email protected]')->name('logout'); // Registration Routes... if ($options['register'] ?? true) { $this->get('register', 'Auth\[email protected]')->name('register'); $this->post('register', 'Auth\[email protected]'); } // Password Reset Routes... if ($options['reset'] ?? true) { $this->resetPassword(); } // Email Verification Routes... if ($options['verify'] ?? false) { $this->emailVerification(); } }

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

إذا أردنا تسجيل الدخول / الخروج والتسجيل فقط ، يمكننا تمرير مجموعة الخيارات التالية:

 $options = ["register" => true, "reset" => false, "verify" => false];

حماية الطرق والحراسات الجمركية

نريد التأكد من أنه لا يمكن الوصول إلى بعض المسارات إلا بواسطة مستخدمين مصادق عليهم ويمكن إجراؤها بسرعة عن طريق إضافة إما استدعاء طريقة البرامج الوسيطة على واجهة الطريق أو تسلسل طريقة البرامج الوسيطة عليها:

 Route::middleware('auth')->get('/user', function (Request $request) { return $request->user(); }); Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth');

يضمن هذا الحارس مصادقة الطلبات الواردة.

تأكيد كلمة المرور

لمزيد من الأمان لموقع الويب ، غالبًا ما تريد تأكيد كلمة مرور المستخدم قبل الانتقال إلى أي مهمة أخرى.

يجب علينا تحديد مسار من عرض تأكيد كلمة المرور للتعامل مع الطلب. سيقوم بالتحقق من صحة المستخدم وإعادة توجيهه إلى وجهته المقصودة. في نفس الوقت ، سوف نتأكد من أن كلمة المرور الخاصة بنا تظهر مؤكدة في الجلسة. بشكل افتراضي ، يجب إعادة تأكيد كلمة المرور كل ثلاث ساعات ، ولكن يمكن تغيير ذلك في ملف التكوين على config / auth.php :

 use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Redirect; Route::post('/confirm-password', function (Request $request) { if (!Hash::check($request->password, $request->user()->password)) { return back()->withErrors([ 'password' => ['The provided password does not match our records.'] ]); } $request->session()->passwordConfirmed(); return redirect()->intended(); })->middleware(['auth']);

عقد قابل للأصالة

يحدد العقد القابل للمصادقة الموجود في Illuminate \ Contracts \ Auth مخططًا لما يجب أن تنفذه واجهة UserProvider:

 namespace Illuminate\Contracts\Auth; interface Authenticable { public function getAuthIdentifierName(); public function getAuthIdentifier(); public function getAuthPassord(); public function getRememberToken(); public function setRememberToken($value); public function getrememberTokenName(); }

تسمح الواجهة لنظام المصادقة بالعمل مع أي فئة "مستخدم" تقوم بتنفيذها.

هذا ينطبق بغض النظر عن ORM أو طبقات التخزين المستخدمة. افتراضيًا ، يحتوي Laravel على App \ Models \ User الذي ينفذ هذه الواجهة ، ويمكن أيضًا رؤية ذلك في ملف التكوين:

 return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ], ];

أحداث المصادقة

هناك الكثير من الأحداث التي يتم إرسالها أثناء عملية المصادقة بأكملها.

اعتمادًا على أهدافك ، يمكنك ربط المستمعين بتلك الأحداث في EventServiceProvider .

مستمعي Laravel
قائمة مستمعات Laravel تم إنشاؤها لخدمة المصادقة الخاصة بنا

بسرعة إنشاء مستخدمين جدد

يمكن إنشاء مستخدم جديد بسرعة من خلال التطبيق / المستخدم :

 $user = new App\User(); $user->password = Hash::make('strong_password'); $user->email = '[email protected]'; $user->name = 'Username'; $user->save();

أو من خلال التابع create static في واجهة المستخدم:

 User::create([ 'password' => Hash::make('strong-password'), 'email' => '[email protected]', 'name' => 'username' ]);

ملخص

يحتوي نظام Laravel البيئي على الكثير من مجموعات بدء تشغيل تطبيقك وتشغيله باستخدام نظام مصادقة ، مثل Breeze و Jetstream. إنها قابلة للتخصيص بدرجة كبيرة حيث يتم إنشاء الكود من جانبنا ، ويمكننا تعديله بقدر ما نريد ، واستخدامه كمخطط إذا لزم الأمر.

هناك العديد من المخاوف الأمنية المتعلقة بالمصادقة وتعقيداتها ، ولكن يمكن حلها جميعًا بسهولة من خلال الأدوات التي يوفرها Laravel. هذه الأدوات قابلة للتخصيص بدرجة عالية وسهلة الاستخدام.

انشر تطبيقات Laravel الخاصة بك بسرعة وكفاءة من خلال خدمة استضافة Laravel السريعة. شاهد تطبيقك عمليًا باستخدام نسخة تجريبية مجانية.