در بسیاری از پروژههای تحت وب، کاربران باید بتوانند در سایت ثبتنام کنند، وارد حساب کاربری خود شوند و به بخشهایی دسترسی داشته باشند که برای کاربران مهمان قابل مشاهده نیستند. برای پیادهسازی این قابلیتها، به یک سیستم احراز هویت نیاز داریم.
Laravel امکانات متعددی برای مدیریت احراز هویت کاربران در اختیار توسعهدهندگان قرار میدهد. با استفاده از این امکانات میتوان فرآیند ورود و خروج، ثبتنام، مدیریت نشست کاربران، بازیابی رمز عبور و محافظت از صفحات را با کد کمتر و امنیت بیشتر پیادهسازی کرد.
در این مقاله یاد میگیریم Authentication در Laravel چیست، چه تفاوتی با Authorization دارد، چگونه کاربران را وارد سیستم کنیم، چطور از صفحات محافظت کنیم و هنگام پیادهسازی احراز هویت چه نکات امنیتی را رعایت کنیم.
Authentication در Laravel چیست؟
Authentication یا احراز هویت، فرآیندی است که مشخص میکند کاربر واردشده به سیستم چه کسی است.
برای مثال، فرض کنید یک فروشگاه اینترنتی با Laravel ساختهاید. کاربران میتوانند محصولات را مشاهده کنند، اما برای مشاهده سفارشهای قبلی، مدیریت آدرسها یا تغییر اطلاعات حساب خود باید وارد سیستم شوند.
در این شرایط، Laravel باید بتواند تشخیص دهد که درخواست فعلی متعلق به کدام کاربر است و آیا آن کاربر قبلاً وارد حساب خود شده است یا خیر.
سیستم Authentication معمولاً وظایف زیر را بر عهده دارد:
- بررسی اطلاعات ورود کاربران
- ثبتنام و ورود به حساب کاربری
- نگهداری وضعیت ورود کاربر
- خروج امن از حساب کاربری
- محافظت از صفحات نیازمند ورود
- مدیریت گزینههایی مانند ورود ماندگار یا Remember Me
- فراهم کردن زیرساخت لازم برای بازیابی رمز عبور و تأیید ایمیل
یکی از مزیتهای Laravel این است که برای انجام این کارها، لازم نیست تمام منطق احراز هویت را از ابتدا بنویسید. این فریمورک ابزارهای آمادهای دارد که میتوانید بر اساس نیاز پروژه از آنها استفاده کنید.
تفاوت Authentication و Authorization در Laravel چیست؟
این دو مفهوم ارتباط نزدیکی با یکدیگر دارند، اما وظایف متفاوتی انجام میدهند.
| مفهوم | کاربرد | مثال |
|---|---|---|
| Authentication | تشخیص هویت کاربر | آیا این درخواست متعلق به کاربر واردشده است؟ |
| Authorization | بررسی مجوز دسترسی کاربر | آیا این کاربر اجازه حذف محصول را دارد؟ |
فرض کنید کاربری وارد پنل مدیریت فروشگاه شده است. Authentication مشخص میکند که این کاربر چه کسی است؛ اما Authorization بررسی میکند که آیا او اجازه مدیریت محصولات یا حذف سفارشها را دارد یا خیر.
در این مقاله روی Authentication تمرکز میکنیم. برای یادگیری مدیریت مجوزها، میتوانی مقاله بعدی این مجموعه با موضوع Authorization در Laravel را مطالعه کنی.
سیستم Authentication در Laravel چگونه کار میکند؟
Laravel برای پیادهسازی احراز هویت، چند بخش اصلی دارد که هر کدام وظیفه مشخصی انجام میدهند.
۱. User Model
مدل User معمولاً نماینده کاربران سیستم است. اطلاعاتی مانند نام، ایمیل، رمز عبور و زمان تأیید ایمیل میتوانند در این مدل و جدول مرتبط با آن نگهداری شوند.
در پروژههای استاندارد Laravel، این مدل معمولاً در مسیر زیر قرار دارد:
app/Models/User.php
Laravel از طریق این مدل میتواند اطلاعات کاربر را از پایگاه داده دریافت کند.
۲. Auth Facade
Auth Facade یکی از ابزارهای اصلی برای کار با سیستم احراز هویت Laravel است. با استفاده از آن میتوان ورود کاربر را بررسی کرد، کاربر فعلی را دریافت کرد یا عملیات ورود و خروج را انجام داد.
برای استفاده از آن، کافی است کلاس زیر را وارد کنید:
use Illuminate\Support\Facades\Auth;
۳. Guard
Guard مشخص میکند که وضعیت احراز هویت کاربر چگونه بررسی و مدیریت شود.
برای مثال، Guard پیشفرض web معمولاً برای احراز هویت مبتنی بر Session در وبسایتها استفاده میشود.
Laravel از Guardهای مختلف پشتیبانی میکند و میتوان برای بخشهای متفاوت یک پروژه، روشهای احراز هویت جداگانهای در نظر گرفت.
۴. User Provider
User Provider مشخص میکند اطلاعات کاربران از کجا دریافت شوند. در حالت معمول، اطلاعات از طریق مدل User و پایگاه داده خوانده میشوند؛ اما Laravel امکان پیکربندی روشهای دیگر را نیز فراهم میکند.
تنظیمات Guardها و Providerها معمولاً در فایل زیر قرار دارد:
config/auth.php
برای پروژههای معمولی، اغلب میتوان از تنظیمات پیشفرض شروع کرد و در صورت نیاز آنها را تغییر داد.
روشهای پیادهسازی Authentication در Laravel
برای پیادهسازی احراز هویت در Laravel، دو رویکرد کلی وجود دارد.
استفاده از Starter Kitها
Starter Kitها بخش مهمی از کدهای اولیه احراز هویت را آماده میکنند. بسته به گزینه انتخابی، ممکن است قابلیتهایی مانند ورود، ثبتنام، بازیابی رمز عبور و تأیید ایمیل در اختیار شما قرار بگیرد.
این روش برای پروژههایی مناسب است که میخواهند سریعتر به یک سیستم احراز هویت استاندارد برسند.
پیادهسازی سفارشی با ابزارهای Laravel
اگر به کنترل بیشتری روی فرآیند ورود و ثبتنام نیاز دارید، میتوانید Routeها، Controllerها و فرمهای خود را بسازید و از ابزارهایی مانند Auth، Session، Validation و Hash استفاده کنید.
در ادامه، نحوه پیادهسازی بخشهای اصلی احراز هویت را بررسی میکنیم.
بررسی ورود کاربر در Laravel
یکی از سادهترین عملیات در سیستم Authentication، بررسی وضعیت ورود کاربر است.
برای اینکه بفهمید کاربر فعلی وارد سیستم شده است یا خیر، میتوانید از متد check استفاده کنید:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// کاربر وارد سیستم شده است
} else {
// کاربر وارد سیستم نشده است
}
متد Auth::check() زمانی مفید است که بخواهید رفتار برنامه را بر اساس وضعیت ورود کاربر تغییر دهید.
برای مثال، ممکن است در یک صفحه عمومی، اطلاعات حساب کاربر واردشده را نمایش دهید و برای کاربران مهمان، لینک ورود به سیستم را نشان دهید.
اگر فقط به شناسه کاربر نیاز داشته باشید، میتوانید از متد زیر استفاده کنید:
$userId = Auth::id();
همچنین برای دریافت مدل کاربر فعلی میتوانید از این کد استفاده کنید:
$user = Auth::user();
if ($user) {
$name = $user->name;
$email = $user->email;
}
این روشها در Controllerها، سرویسها و بخشهایی از برنامه که به اطلاعات کاربر فعلی نیاز دارند، کاربرد زیادی دارند.
آموزش محافظت از Route با Middleware در Laravel
یکی از کاربردیترین قابلیتهای سیستم Authentication در Laravel، محافظت از مسیرهایی است که فقط کاربران واردشده باید به آنها دسترسی داشته باشند.
برای این کار از Middleware با نام auth استفاده میکنیم.
برای مثال، فرض کنید صفحه داشبورد کاربران با آدرس /dashboard در دسترس است. میخواهیم فقط کاربران واردشده بتوانند این صفحه را مشاهده کنند.
use Illuminate\Support\Facades\Route;
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
در این مثال، Laravel پیش از اجرای Route، وضعیت احراز هویت کاربر را بررسی میکند.
اگر کاربر وارد سیستم شده باشد، درخواست ادامه پیدا میکند. در غیر این صورت، رفتار برنامه به تنظیمات احراز هویت و نسخه Laravel بستگی دارد؛ برای Routeهای وب، معمولاً کاربر به صفحه ورود هدایت میشود.
محافظت از چند Route بهصورت همزمان
اگر چند صفحه به احراز هویت نیاز داشته باشند، بهتر است آنها را در یک گروه قرار دهید:
use Illuminate\Support\Facades\Route;
Route::middleware('auth')->group(function () {
Route::get('/dashboard', function () {
return view('dashboard');
});
Route::get('/profile', function () {
return view('profile');
});
Route::get('/orders', function () {
return view('orders');
});
});
در این حالت، تمام Routeهای داخل گروه از Middleware مربوط به احراز هویت استفاده میکنند.
این ساختار در پروژههایی مانند فروشگاه اینترنتی، سامانه آموزشی، پنل مشتریان و سیستم مدیریت پروژه بسیار کاربردی است.
Middleware مربوط به guest
در مقابل Middleware auth، Middleware دیگری با نام guest وجود دارد که برای مسیرهایی مناسب است که معمولاً نباید در اختیار کاربران واردشده قرار بگیرند.
برای مثال، میتوانید صفحات ورود و ثبتنام را به شکل زیر تعریف کنید:
Route::middleware('guest')->group(function () {
Route::get('/login', function () {
return view('auth.login');
});
Route::get('/register', function () {
return view('auth.register');
});
});
نحوه هدایت کاربران واردشده از این صفحات، به پیکربندی برنامه بستگی دارد.
آموزش ورود کاربران با Auth::attempt در Laravel
یکی از متدهای مهم در سیستم احراز هویت Laravel، متد Auth::attempt() است.
این متد اطلاعات ورود کاربر را بررسی میکند و در صورت معتبر بودن آنها، فرآیند ورود را انجام میدهد.
فرض کنید یک فرم ورود دارید که ایمیل و رمز عبور را از کاربر دریافت میکند. میتوانید اطلاعات را اعتبارسنجی کرده و سپس آنها را به سیستم Authentication بسپارید.
نمونه زیر را در یک Controller در نظر بگیرید:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required', 'string'],
]);
if (Auth::attempt(
$credentials,
$request->boolean('remember')
)) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()
->withErrors([
'email' => 'اطلاعات ورود صحیح نیست.',
])
->onlyInput('email');
}
}
در این مثال چند نکته مهم وجود دارد.
اول، اعتبارسنجی اطلاعات ورودی: متد validate بررسی میکند که ایمیل و رمز عبور در درخواست وجود داشته باشند و ایمیل از قالب معتبر برخوردار باشد.
دوم، بررسی اطلاعات ورود: متد Auth::attempt() اطلاعات کاربر را با اطلاعات ذخیرهشده در سیستم مقایسه میکند. در حالت استاندارد، رمز عبور ذخیرهشده بهصورت هش نگهداری میشود و Laravel آن را به شکل مناسب بررسی میکند.
سوم، بازسازی Session: بعد از ورود موفق، متد session()->regenerate() شناسه نشست را تغییر میدهد تا در برابر حملاتی مانند Session Fixation محافظت بهتری ایجاد شود.
چهارم، هدایت به صفحه موردنظر: متد redirect()->intended('/dashboard') تلاش میکند کاربر را به صفحهای برگرداند که پیش از ورود قصد مشاهده آن را داشته است. اگر چنین مقصدی وجود نداشته باشد، داشبورد انتخاب میشود.
پنجم، مدیریت خطا: اگر اطلاعات ورود معتبر نباشند، کاربر به فرم قبلی بازمیگردد و پیام خطا دریافت میکند.
تعریف Routeهای ورود
برای نمونه بالا، میتوانید Routeهای ورود را در فایل routes/web.php تعریف کنید:
use App\Http\Controllers\LoginController;
use Illuminate\Support\Facades\Route;
Route::middleware('guest')->group(function () {
Route::get('/login', function () {
return view('auth.login');
})->name('login');
Route::post('/login', [
LoginController::class,
'login',
]);
});
در این مثال، درخواست GET فرم ورود را نمایش میدهد و درخواست POST اطلاعات فرم را برای بررسی به Controller ارسال میکند.
برای تکمیل این فرآیند، باید View مربوط به auth.login و فرم HTML آن را نیز ایجاد کنید.
در فرم ورود، استفاده از متد POST و محافظت CSRF در فرمهای وب Laravel اهمیت دارد. همچنین بهتر است فرم را با Validation سمت سرور بررسی کنید و فقط به اعتبارسنجی مرورگر اکتفا نکنید.
آموزش خروج کاربر از حساب در Laravel
خروج از حساب کاربری فقط به معنای پاک کردن اطلاعات نمایشی از صفحه نیست. باید وضعیت احراز هویت کاربر و نشست مرتبط با آن بهدرستی مدیریت شود.
برای خروج کاربر از سیستم، میتوانید از کد زیر استفاده کنید:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
در این مثال:
Auth::logout()کاربر را از Guard فعلی خارج میکند.session()->invalidate()نشست فعلی را باطل میکند.session()->regenerateToken()توکن CSRF نشست جدید را تولید میکند.- در پایان، کاربر به صفحه اصلی هدایت میشود.
برای Route خروج، بهتر است از متد POST استفاده کنید؛ زیرا خروج از حساب یک عملیات تغییردهنده وضعیت است و نباید صرفاً با بازدید از یک لینک GET اجرا شود.
Route::post('/logout', [
LoginController::class,
'logout',
])->middleware('auth')->name('logout');
فرم خروج باید توکن CSRF داشته باشد. در Blade، میتوانید از دستور @csrf استفاده کنید.
آموزش ثبتنام کاربران در Laravel
در بسیاری از پروژهها، کاربران باید بتوانند حساب کاربری جدید ایجاد کنند. برای پیادهسازی این قابلیت، معمولاً به یک فرم ثبتنام، اعتبارسنجی اطلاعات و ذخیره امن رمز عبور نیاز دارید.
در ادامه یک نمونه ساده از ثبتنام کاربر را بررسی میکنیم.
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
class RegisterController extends Controller
{
public function register(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'email',
'max:255',
'unique:users,email',
],
'password' => [
'required',
'confirmed',
Password::min(8),
],
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make(
$validated['password']
),
]);
Auth::login($user);
$request->session()->regenerate();
return redirect('/dashboard');
}
}
این نمونه یک پیادهسازی پایه است و باید متناسب با ساختار پروژه تکمیل شود.
بررسی بخشهای مهم کد ثبتنام
اعتبارسنجی ایمیل: قانون unique:users,email مانع ثبت ایمیلی میشود که قبلاً در جدول users ثبت شده است. بهتر است در پایگاه داده نیز محدودیت یکتا برای ایمیل داشته باشید تا از ثبت رکوردهای تکراری در شرایط همزمان جلوگیری شود.
بررسی رمز عبور: قانون confirmed انتظار دارد فیلد password_confirmation نیز در درخواست وجود داشته باشد و با رمز عبور مطابقت داشته باشد.
هش کردن رمز عبور: متد Hash::make() رمز عبور را بهصورت هش ذخیره میکند. رمز عبور نباید به شکل متن ساده در پایگاه داده نگهداری شود.
ورود پس از ثبتنام: متد Auth::login($user) کاربر ایجادشده را وارد سیستم میکند. بازسازی Session نیز پس از ورود اهمیت دارد.
برای استفاده از این کد، مدل User باید اجازه پر کردن فیلدهای موردنیاز را داشته باشد. همچنین فرم ثبتنام باید فیلدهای name، email، password و password_confirmation را ارسال کند.
مدیریت رمز عبور کاربران در Laravel
رمز عبور یکی از حساسترین اطلاعات کاربران است و باید به شکل امن ذخیره و بررسی شود.
Laravel برای مدیریت رمز عبور، Facadeای با نام Hash ارائه میدهد.
هش کردن رمز عبور
use Illuminate\Support\Facades\Hash;
$hashedPassword = Hash::make('StrongPassword123');
این کد یک مقدار هششده تولید میکند. مقدار تولیدشده را میتوان در ستون password جدول کاربران ذخیره کرد.
نکته مهم این است که هش کردن رمز عبور با رمزگذاری معمولی متفاوت است. هش رمز عبور برای ذخیرهسازی امن طراحی شده و نباید انتظار داشته باشید که بتوانید مقدار هششده را به رمز عبور اصلی تبدیل کنید.
بررسی رمز عبور
در شرایطی که نیاز دارید رمز عبور واردشده را با مقدار ذخیرهشده مقایسه کنید، میتوانید از Hash::check() استفاده کنید:
if (Hash::check(
$plainPassword,
$user->password
)) {
// رمز عبور معتبر است
}
البته در فرآیند معمول ورود با Auth::attempt() نیازی نیست خودتان رمز عبور را بهصورت دستی بررسی کنید؛ Laravel این کار را در فرآیند احراز هویت انجام میدهد.
نکته مهم درباره ذخیره رمز عبور
هرگز رمز عبور را بهصورت مستقیم ذخیره نکنید:
// روش ناامن
'password' => $request->password
بهجای آن، از Hash::make() یا روش استاندارد هشکردن رمز عبور در مدل خود استفاده کنید.
اگر مدل User شما از Cast مربوط به hashed استفاده میکند، تنظیمات ذخیره رمز عبور را بهصورت یکپارچه طراحی کنید تا منطق هش کردن در چند لایه تکرار نشود.
قابلیت Remember Me در Laravel
در برخی وبسایتها، هنگام ورود گزینهای با عنوان «مرا به خاطر بسپار» وجود دارد. این گزینه به کاربر اجازه میدهد در شرایط پشتیبانیشده، بدون وارد کردن مجدد اطلاعات ورود، برای مدت بیشتری وارد حساب خود باقی بماند.
در Laravel میتوانید از پارامتر دوم Auth::attempt() برای این قابلیت استفاده کنید:
$credentials = $request->only(
'email',
'password'
);
if (Auth::attempt($credentials, true)) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
در این مثال مقدار true درخواست ورود ماندگار را فعال میکند.
برای استفاده از این قابلیت، ساختار مدل کاربر و تنظیمات احراز هویت باید با سازوکار Remember Me در Laravel سازگار باشند. در مدل User استاندارد، معمولاً ستون remember_token برای این منظور وجود دارد.
فعال کردن این قابلیت به معنای بینیازی از رعایت امنیت نیست. بهتر است روی دستگاههای عمومی یا مشترک، کاربران را به استفاده نکردن از ورود ماندگار تشویق کنید.
تفاوت Session و Authentication در Laravel
Session و Authentication به یکدیگر مرتبط هستند، اما یک مفهوم واحد نیستند.
Session برای نگهداری اطلاعات مرتبط با یک نشست استفاده میشود. Authentication مشخص میکند که کاربر چه کسی است و آیا احراز هویت شده است یا خیر.
در احراز هویت معمول وب، Laravel میتواند از Session برای حفظ وضعیت ورود کاربر بین درخواستهای مختلف استفاده کند.
برای مثال، وقتی کاربری وارد سایت میشود، نباید در هر درخواست دوباره ایمیل و رمز عبور خود را ارسال کند. سیستم احراز هویت با استفاده از سازوکار نشست و کوکی مرتبط، وضعیت ورود او را مدیریت میکند.
برای آشنایی بیشتر با این مفاهیم، مقالههای «Session در Laravel» و «Cookie در Laravel» نیز میتوانند مکمل این آموزش باشند.
محدود کردن تلاشهای ورود و جلوگیری از حملات Brute Force
یکی از مشکلات امنیتی سیستمهای ورود، تلاش مکرر برای حدس زدن رمز عبور کاربران است. به این نوع حمله Brute Force گفته میشود.
اگر یک فرم ورود بدون محدودیت تلاش در دسترس باشد، مهاجم میتواند تعداد زیادی رمز عبور را امتحان کند.
برای کاهش این خطر، بهتر است اقدامات زیر را انجام دهید:
- تعداد تلاشهای ورود در بازه زمانی مشخص را محدود کنید.
- محدودیت را بر اساس ترکیبی مناسب از شناسه کاربر و اطلاعات درخواست طراحی کنید.
- پیام خطای ورود، جزئیات حساس درباره وجود یا عدم وجود حساب را افشا نکند.
- از رمز عبورهای قوی و سیاست مناسب بازیابی حساب استفاده کنید.
- در صورت نیاز، تأیید چندمرحلهای را به سیستم اضافه کنید.
Laravel امکانات Rate Limiting را در اختیار توسعهدهندگان قرار میدهد. بسته به ساختار پروژه و روش پیادهسازی احراز هویت، میتوانید محدودیت تلاشهای ورود را با Rate Limiter یا امکانات موجود در Starter Kit انتخابی تنظیم کنید.
صرفاً نمایش یک پیام خطا کافی نیست؛ محدودیت باید در سمت سرور اجرا شود و در برابر درخواستهای متوالی مؤثر باشد.
بازیابی رمز عبور در Laravel
کاربران ممکن است رمز عبور خود را فراموش کنند. به همین دلیل، سیستم احراز هویت معمولاً به قابلیت Password Reset نیاز دارد.
فرآیند بازیابی رمز عبور معمولاً شامل مراحل زیر است:
- کاربر ایمیل خود را در فرم بازیابی وارد میکند.
- سیستم درخواست بازیابی را بررسی میکند.
- یک لینک یا توکن بازیابی امن و محدود به زمان ایجاد یا ارسال میشود.
- کاربر از طریق لینک معتبر، رمز عبور جدیدی تعیین میکند.
- سیستم رمز عبور جدید را بهصورت امن ذخیره میکند.
Laravel زیرساختهایی برای مدیریت توکنهای بازیابی رمز عبور و ارسال اعلانهای مرتبط دارد. برای استفاده از آنها، باید تنظیمات مربوط به ارسال ایمیل و مسیرهای بازیابی را نیز انجام دهید.
در پروژههای واقعی، توکن بازیابی باید دارای اعتبار زمانی محدود باشد و پس از استفاده یا انقضا، دوباره قابل استفاده نباشد.
همچنین بهتر است پیامهای مربوط به درخواست بازیابی رمز عبور، اطلاعات غیرضروری درباره وجود یا عدم وجود حساب کاربری را افشا نکنند.
تأیید ایمیل کاربران در Laravel
در بسیاری از سیستمها، لازم است کاربر پس از ثبتنام مالکیت آدرس ایمیل خود را تأیید کند.
برای مثال، در یک سامانه آموزشی ممکن است بخواهید پیش از فعال کردن برخی امکانات، مطمئن شوید ایمیل واردشده در اختیار همان کاربر است.
Laravel از قابلیت Email Verification پشتیبانی میکند. پیادهسازی آن معمولاً به رابط MustVerifyEmail در مدل کاربر، تنظیم مسیرهای تأیید و ارسال اعلان ایمیل نیاز دارد.
برای محافظت از صفحاتی که فقط کاربران دارای ایمیل تأییدشده باید ببینند، میتوانید از Middleware مربوط به تأیید ایمیل استفاده کنید؛ به شرطی که قابلیت تأیید ایمیل در پروژه بهدرستی پیکربندی شده باشد.
نکته مهم این است که ورود کاربر و تأیید ایمیل دو مرحله متفاوت هستند. یک کاربر ممکن است وارد سیستم شده باشد، اما هنوز ایمیل خود را تأیید نکرده باشد.
Authentication در Laravel برای API چه تفاوتی دارد؟
روش احراز هویت در برنامههای وب همیشه با روش مناسب API یکسان نیست.
در وبسایتهای معمولی، احراز هویت مبتنی بر Session و Cookie اغلب انتخاب مناسبی است. اما در APIها، روش احراز هویت باید با نوع کلاینت و معماری برنامه هماهنگ باشد.
برای مثال، یک API ممکن است توسط اپلیکیشن موبایل، یک سرویس خارجی یا یک پنل JavaScript مصرف شود. در این شرایط، باید مشخص کنید که کلاینت چگونه هویت خود را در درخواستها اثبات میکند.
Laravel Sanctum یکی از ابزارهای مهم برای احراز هویت API و برخی برنامههای مبتنی بر SPA است. روش مناسب استفاده از آن به نوع کلاینت و معماری پروژه بستگی دارد.
بهطور کلی، برای انتخاب روش احراز هویت API باید به موارد زیر توجه کنید:
- نوع کلاینت مصرفکننده API
- نیاز یا عدم نیاز به Session و Cookie
- روش نگهداری و ارسال اعتبارنامهها
- نحوه لغو دسترسی یا ابطال توکنها
- استفاده از HTTPS
- محدودیت نرخ درخواستها و سیاستهای امنیتی
در مقاله «Laravel Sanctum» میتوان این موضوع را بهصورت مستقل و عملی بررسی کرد.
نکات امنیتی مهم در Authentication لاراول
پیادهسازی سیستم ورود صرفاً با بررسی ایمیل و رمز عبور کامل نمیشود. برای داشتن یک سیستم امن، باید به چند نکته توجه کنید.
۱. از رمز عبور خام استفاده نکنید
رمز عبور را بهصورت متن ساده ذخیره نکنید و برای ذخیرهسازی از سازوکار استاندارد هش Laravel استفاده کنید.
۲. پس از ورود موفق Session را بازسازی کنید
پس از احراز هویت موفق، شناسه نشست را با session()->regenerate() تغییر دهید تا ریسک حملات Session Fixation کاهش پیدا کند.
۳. فرمهای وب را در برابر CSRF محافظت کنید
فرمهای تغییردهنده وضعیت، از جمله فرم ورود و خروج، باید متناسب با معماری برنامه محافظت شوند. در فرمهای Blade معمولاً از دستور @csrf استفاده میشود.
۴. برای تلاشهای ورود محدودیت تعیین کنید
بدون محدودیت مناسب، فرم ورود میتواند هدف حملات حدس رمز عبور قرار بگیرد.
۵. اطلاعات حساس را در پیام خطا نمایش ندهید
پیامهای خطا نباید رمز عبور، توکنهای حساس یا اطلاعات داخلی برنامه را افشا کنند. برای مثال، در بسیاری از سیستمها بهتر است برای ایمیل ناموجود و رمز عبور اشتباه، پیام عمومی یکسانی نمایش داده شود.
۶. در محیط Production از HTTPS استفاده کنید
اطلاعات ورود و کوکیهای احراز هویت باید از طریق ارتباط امن منتقل شوند. همچنین تنظیمات Cookie و Session باید با معماری و دامنههای برنامه هماهنگ باشند.
۷. پس از خروج، وضعیت احراز هویت را بهدرستی پاک کنید
از Auth::logout()، باطل کردن Session و بازسازی توکن CSRF متناسب با روش احراز هویت استفاده کنید.
۸. از منطق احراز هویت سفارشی و ناامن خودداری کنید
اگر از ابزارهای استاندارد Laravel استفاده میکنید، لازم نیست تمام منطق بررسی رمز عبور، نگهداری وضعیت ورود و مدیریت Session را از ابتدا بنویسید. هرچه منطق امنیتی بیشتر و بدون نیاز بازنویسی شود، احتمال خطا نیز افزایش پیدا میکند.
خطاهای رایج هنگام پیادهسازی Authentication در Laravel
در هنگام پیادهسازی احراز هویت، ممکن است با مشکلاتی روبهرو شوید که در ادامه چند مورد رایج را بررسی میکنیم.
خطای Route [login] not defined
این خطا ممکن است زمانی رخ دهد که کاربر مهمان به یک Route محافظتشده دسترسی پیدا کند، اما برنامه نتواند مقصد ورود را پیدا کند.
برای رفع آن، بررسی کنید Route ورود با نام مناسب تعریف شده باشد و تنظیمات احراز هویت پروژه با ساختار نسخه Laravel شما سازگار باشد.
کاربر با وجود رمز عبور صحیح نمیتواند وارد شود
در این شرایط، موارد زیر را بررسی کنید:
- آیا ایمیل واردشده دقیقاً با اطلاعات ذخیرهشده مطابقت دارد؟
- آیا رمز عبور هنگام ثبتنام به شکل صحیح هش شده است؟
- آیا مدل User و User Provider به جدول صحیح متصل هستند؟
- آیا Guard مورد استفاده همان Guard مورد انتظار پروژه است؟
- آیا نام فیلدهای فرم با دادههایی که به
Auth::attempt()ارسال میکنید مطابقت دارند؟
یکی از اشتباهات رایج، هش کردن دستی رمز عبور پیش از ارسال آن به Auth::attempt() است. معمولاً باید رمز عبور خام دریافتشده از فرم را به متد بدهید تا Laravel آن را با مقدار ذخیرهشده مقایسه کند.
کاربر پس از ورود به صفحه داشبورد منتقل نمیشود
اگر کاربر وارد سیستم میشود، اما مقصد موردنظر نمایش داده نمیشود، منطق Redirect و Middlewareها را بررسی کنید.
متد redirect()->intended() در صورتی که مقصد ذخیرهشدهای وجود نداشته باشد، از مسیر جایگزین استفاده میکند. همچنین ممکن است Middleware یا منطق دیگری در برنامه مسیر هدایت را تغییر دهد.
کاربر پس از Refresh از حساب خارج میشود
این مشکل میتواند به تنظیمات Session، Cookie، دامنه، HTTPS، تنظیمات ذخیرهسازی نشست یا پیکربندی Guard مربوط باشد.
اگر برنامه چند دامنه دارد یا پشت Reverse Proxy اجرا میشود، تنظیمات محیط اجرا و Cookieها را نیز بررسی کنید. پاک کردن Cache تنظیمات Laravel ممکن است پس از تغییر پیکربندی لازم باشد، اما پیش از آن باید علت اصلی مشکل مشخص شود.
پرسشهای متداول درباره Authentication در Laravel
Authentication در Laravel چیست؟
Authentication فرآیندی است که هویت کاربر را بررسی میکند و مشخص میسازد آیا درخواست متعلق به یک کاربر احراز هویتشده است یا خیر. Laravel ابزارهایی مانند Auth Facade، Guard، User Provider و Middleware را برای پیادهسازی این قابلیت فراهم میکند.
برای ورود کاربر در Laravel از چه متدی استفاده میشود؟
برای ورود با اطلاعاتی مانند ایمیل و رمز عبور، معمولاً از Auth::attempt() استفاده میشود. برای ورود یک کاربر مشخص که قبلاً بهصورت معتبر شناسایی شده است، متد Auth::login() نیز کاربرد دارد.
چگونه در Laravel بررسی کنیم کاربر وارد سیستم شده است؟
با استفاده از Auth::check() میتوانید وضعیت احراز هویت را بررسی کنید. برای دریافت شناسه کاربر فعلی نیز متد Auth::id() کاربرد دارد.
چگونه یک صفحه را فقط برای کاربران واردشده قابل مشاهده کنیم؟
میتوانید Middleware با نام auth را به Route اضافه کنید:
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
آیا برای پیادهسازی Authentication حتماً باید Starter Kit نصب کنیم؟
خیر. Starter Kitها پیادهسازی بخش زیادی از قابلیتهای متداول را ساده میکنند، اما میتوانید با ابزارهای اصلی Laravel نیز سیستم ورود و ثبتنام سفارشی بسازید.
تفاوت Authentication و Authorization چیست؟
Authentication هویت کاربر را بررسی میکند؛ Authorization مشخص میکند کاربر احراز هویتشده اجازه انجام چه عملیات یا دسترسی به چه منابعی را دارد.
آیا Auth در Laravel برای API هم کاربرد دارد؟
Laravel ابزارهای متعددی برای احراز هویت ارائه میدهد، اما روش مناسب API به نوع کلاینت و معماری پروژه بستگی دارد. برای بسیاری از سناریوهای API و SPA، Laravel Sanctum یکی از گزینههای مهم است.
جمعبندی
Authentication یکی از بخشهای اساسی بسیاری از پروژههای Laravel است. با استفاده از ابزارهای داخلی این فریمورک میتوان فرآیند ورود و خروج کاربران، ثبتنام، مدیریت Session و محافظت از صفحات را با ساختاری منظم پیادهسازی کرد.
در این مقاله با Auth Facade، متدهای Auth::check()، Auth::attempt() و Auth::logout()، Middleware مربوط به احراز هویت، ثبتنام کاربران، هش کردن رمز عبور و نکات امنیتی مهم آشنا شدیم.
اگر قصد دارید یک فروشگاه اینترنتی، پنل مدیریت، سامانه آموزشی یا نرمافزار تحت وب با Laravel بسازید، یادگیری Authentication یکی از قدمهای ضروری شماست. پس از تسلط بر آن، میتوانید سراغ موضوع بعدی یعنی Authorization بروید تا نحوه مدیریت مجوزها و کنترل دسترسی کاربران را یاد بگیرید.





