نسخه:

بازنشانی رمزهای عبور

معرفی

اکثر برنامه های کاربردی وب راهی را برای کاربران فراهم می کنند تا رمزهای عبور فراموش شده خود را بازنشانی کنند. لاراول به جای اینکه شما را مجبور کند که برای هر برنامه‌ای که ایجاد می‌کنید مجدداً این کار را با دست پیاده‌سازی کنید، خدمات مناسبی برای ارسال پیوندهای بازنشانی رمز عبور و بازنشانی رمزهای عبور امن ارائه می‌دهد.

می خواهید سریع شروع کنید؟ یک کیت شروع برنامه لاراول را در یک برنامه جدید لاراول نصب کنید. کیت های شروع لاراول از داربست کل سیستم احراز هویت شما، از جمله بازنشانی رمزهای عبور فراموش شده، مراقبت می کند.

آماده سازی مدل

قبل از استفاده از ویژگی های بازنشانی رمز عبور لاراول، App\Models\User مدل برنامه شما باید از این Illuminate\Notifications\Notifiable ویژگی استفاده کند. به طور معمول، این ویژگی قبلاً در App\Models\User مدل پیش فرض ایجاد شده با برنامه های جدید لاراول گنجانده شده است.

بعد، بررسی کنید که App\Models\User مدل شما Illuminate\Contracts\Auth\CanResetPassword قرارداد را اجرا می کند. مدل App\Models\User موجود با فریم ورک قبلاً این رابط را پیاده‌سازی می‌کند و از این Illuminate\Auth\Passwords\CanResetPassword ویژگی برای گنجاندن روش‌های مورد نیاز برای پیاده‌سازی رابط استفاده می‌کند.

آماده سازی پایگاه داده

یک جدول باید برای ذخیره رمزهای بازنشانی رمز عبور برنامه شما ایجاد شود. به طور معمول، این در انتقال پایگاه داده پیش فرض لاراول گنجانده شده است 0001_01_01_000000_create_users_table.php .

پیکربندی هاست های مورد اعتماد

به طور پیش فرض، لاراول بدون توجه به محتوای Host هدر درخواست HTTP به تمام درخواست هایی که دریافت می کند پاسخ می دهد. علاوه بر این، Host هنگام ایجاد URL های مطلق برای برنامه شما در طول یک درخواست وب، از مقدار هدر استفاده می شود.

به طور معمول، شما باید وب سرور خود را مانند Nginx یا Apache پیکربندی کنید تا فقط درخواست هایی را به برنامه شما ارسال کند که با نام میزبان مشخص شده مطابقت دارند. با این حال، اگر توانایی سفارشی کردن وب سرور خود را به طور مستقیم ندارید و باید به لاراول دستور دهید که فقط به نام های میزبان خاصی پاسخ دهد، می توانید این کار را با استفاده از روش trustHosts میان افزار در فایل برنامه خود انجام دهید bootstrap/app.php . این امر به ویژه زمانی مهم است که برنامه شما قابلیت بازنشانی رمز عبور را ارائه می دهد.

برای کسب اطلاعات بیشتر در مورد این روش میان‌افزار، لطفاً به TrustHosts مستندات میان‌افزار مراجعه کنید .

مسیریابی

برای اجرای صحیح پشتیبانی برای اجازه دادن به کاربران برای تنظیم مجدد رمزهای عبور خود، باید چندین مسیر را تعریف کنیم. اول، ما به یک جفت مسیر نیاز داریم که به کاربر اجازه می دهد از طریق آدرس ایمیل خود، پیوند بازنشانی رمز عبور را درخواست کند. دوم، زمانی که کاربر از پیوند بازنشانی رمز عبور که برای او ایمیل شده بازدید می‌کند و فرم بازنشانی رمز عبور را تکمیل می‌کند، به یک جفت مسیر نیاز داریم تا در واقع بازنشانی رمز عبور را انجام دهیم.

ابتدا مسیرهایی را که برای درخواست پیوندهای بازنشانی رمز عبور لازم است تعریف می کنیم. برای شروع، مسیری را تعریف می‌کنیم که با فرم درخواست پیوند بازنشانی رمز عبور، نما را برمی‌گرداند:

Route::get('/forgot-password', function () {
return view('auth.forgot-password');
})->middleware('guest')->name('password.request');

نمای بازگردانده شده توسط این مسیر باید دارای یک فرم حاوی یک email فیلد باشد که به کاربر اجازه می دهد برای یک آدرس ایمیل معین، پیوند بازنشانی رمز عبور را درخواست کند.

در مرحله بعد، مسیری را تعریف می کنیم که درخواست ارسال فرم را از نمای "رمز عبور فراموش کرده ام" انجام می دهد. این مسیر مسئول اعتبارسنجی آدرس ایمیل و ارسال درخواست بازنشانی رمز عبور به کاربر مربوطه خواهد بود:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
 
Route::post('/forgot-password', function (Request $request) {
$request->validate(['email' => 'required|email']);
 
$status = Password::sendResetLink(
$request->only('email')
);
 
return $status === Password::RESET_LINK_SENT
? back()->with(['status' => __($status)])
: back()->withErrors(['email' => __($status)]);
})->middleware('guest')->name('password.email');

قبل از حرکت، اجازه دهید این مسیر را با جزئیات بیشتری بررسی کنیم. ابتدا ویژگی درخواست email تایید می شود. در مرحله بعد، ما از "کارگزار رمز عبور" داخلی لاراول (از طریق Password نما) برای ارسال لینک بازنشانی رمز عبور به کاربر استفاده خواهیم کرد. کارگزار رمز عبور از بازیابی کاربر توسط فیلد داده شده (در این مورد آدرس ایمیل) و ارسال لینک بازنشانی رمز عبور از طریق سیستم اعلان داخلی لاراول برای کاربر مراقبت می کند .

این sendResetLink روش یک اسلاگ "وضعیت" را برمی گرداند. این وضعیت ممکن است با استفاده از راهنماهای محلی سازی لاراول ترجمه شود تا پیامی کاربرپسند در مورد وضعیت درخواست کاربر به کاربر نمایش داده شود. ترجمه وضعیت بازنشانی رمز عبور توسط lang/{lang}/passwords.php فایل زبان برنامه شما تعیین می شود. یک ورودی برای هر مقدار ممکن از Slug وضعیت در passwords فایل زبان قرار دارد.

به طور پیش فرض، اسکلت برنامه لاراول شامل lang دایرکتوری نمی شود. اگر می خواهید فایل های زبان لاراول را شخصی سازی کنید، می توانید آنها را از طریق lang:publish دستور Artisan منتشر کنید.

ممکن است تعجب کنید که لاراول چگونه می داند که چگونه رکورد کاربر را از پایگاه داده برنامه شما هنگام فراخوانی متد Password نما بازیابی کند sendResetLink . کارگزار رمز عبور لاراول از "ارائه دهندگان کاربر" سیستم احراز هویت شما برای بازیابی سوابق پایگاه داده استفاده می کند. ارائه دهنده کاربری مورد استفاده توسط کارگزار رمز عبور در passwords آرایه پیکربندی فایل پیکربندی شما پیکربندی شده است config/auth.php . برای کسب اطلاعات بیشتر در مورد نوشتن ارائه دهندگان کاربر سفارشی، به اسناد احراز هویت مراجعه کنید .

هنگام پیاده سازی دستی بازنشانی رمز عبور، باید محتویات نماها و مسیرها را خودتان تعریف کنید. اگر مایل به داربستی هستید که شامل تمام منطق لازم برای احراز هویت و تأیید باشد، کیت های شروع برنامه Laravel را بررسی کنید .

بازنشانی رمز عبور

فرم بازنشانی رمز عبور

در مرحله بعد، مسیرهای لازم برای بازنشانی رمز عبور را زمانی که کاربر روی پیوند بازنشانی رمز عبور که برای او ایمیل شده است کلیک کند و رمز عبور جدیدی ارائه کند، تعریف می کنیم. ابتدا اجازه دهید مسیری را تعریف کنیم که فرم بازنشانی رمز عبور را که با کلیک کاربر روی پیوند بازنشانی رمز عبور نمایش داده می شود، نمایش می دهد. این مسیر پارامتری را دریافت می کند token که بعداً برای تأیید درخواست بازنشانی رمز عبور از آن استفاده خواهیم کرد:

Route::get('/reset-password/{token}', function (string $token) {
return view('auth.reset-password', ['token' => $token]);
})->middleware('guest')->name('password.reset');

نمای بازگردانده شده توسط این مسیر باید فرمی حاوی یک email فیلد، یک password فیلد، یک password_confirmation فیلد و یک token فیلد پنهان را نمایش دهد که باید حاوی مقدار راز $token دریافت شده توسط مسیر ما باشد.

رسیدگی به ارسال فرم

البته، ما باید مسیری را تعریف کنیم تا در واقع به ارسال فرم بازنشانی رمز عبور رسیدگی کند. این مسیر مسئول تایید درخواست ورودی و به روز رسانی رمز عبور کاربر در پایگاه داده خواهد بود:

use App\Models\User;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
 
Route::post('/reset-password', function (Request $request) {
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => 'required|min:8|confirmed',
]);
 
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function (User $user, string $password) {
$user->forceFill([
'password' => Hash::make($password)
])->setRememberToken(Str::random(60));
 
$user->save();
 
event(new PasswordReset($user));
}
);
 
return $status === Password::PASSWORD_RESET
? redirect()->route('login')->with('status', __($status))
: back()->withErrors(['email' => [__($status)]]);
})->middleware('guest')->name('password.update');

قبل از حرکت، اجازه دهید این مسیر را با جزئیات بیشتری بررسی کنیم. ابتدا، صفات token ، email و خصیصه های درخواست password تایید می شوند. در مرحله بعد، ما از "کارگزار رمز عبور" داخلی لاراول (از طریق Password نما) برای تأیید اعتبار درخواست بازنشانی رمز عبور استفاده خواهیم کرد.

اگر رمز، آدرس ایمیل و رمز عبور داده شده به کارگزار رمز عبور معتبر باشد، بسته شدن ارسال شده به reset روش فراخوانی می شود. در این بسته شدن، که نمونه کاربر و رمز عبور متن ساده ارائه شده به فرم بازنشانی رمز عبور را دریافت می کند، ممکن است رمز عبور کاربر را در پایگاه داده به روز کنیم.

این reset روش یک اسلاگ "وضعیت" را برمی گرداند. این وضعیت ممکن است با استفاده از راهنماهای محلی سازی لاراول ترجمه شود تا پیامی کاربرپسند در مورد وضعیت درخواست کاربر به کاربر نمایش داده شود. ترجمه وضعیت بازنشانی رمز عبور توسط lang/{lang}/passwords.php فایل زبان برنامه شما تعیین می شود. یک ورودی برای هر مقدار ممکن از Slug وضعیت در passwords فایل زبان قرار دارد. اگر برنامه شما حاوی دایرکتوری نیست lang ، می توانید آن را با استفاده از lang:publish دستور Artisan ایجاد کنید.

قبل از حرکت، ممکن است تعجب کنید که لاراول چگونه می داند که چگونه رکورد کاربر را از پایگاه داده برنامه شما هنگام فراخوانی متد Password نما بازیابی کند reset . کارگزار رمز عبور لاراول از "ارائه دهندگان کاربر" سیستم احراز هویت شما برای بازیابی سوابق پایگاه داده استفاده می کند. ارائه دهنده کاربری مورد استفاده توسط کارگزار رمز عبور در passwords آرایه پیکربندی فایل پیکربندی شما پیکربندی شده است config/auth.php . برای کسب اطلاعات بیشتر در مورد نوشتن ارائه دهندگان کاربر سفارشی، به اسناد احراز هویت مراجعه کنید .

حذف توکن های منقضی شده

رمزهای بازنشانی رمز عبور که منقضی شده اند همچنان در پایگاه داده شما وجود خواهند داشت. با این حال، می توانید به راحتی این رکوردها را با استفاده از auth:clear-resets دستور Artisan حذف کنید:

php artisan auth:clear-resets

اگر می‌خواهید این فرآیند را خودکار کنید، دستور را به زمان‌بندی برنامه خود اضافه کنید :

use Illuminate\Support\Facades\Schedule;
 
Schedule::command('auth:clear-resets')->everyFifteenMinutes();

سفارشی سازی

می توانید URL پیوند بازنشانی رمز عبور را با استفاده از createUrlUsing روش ارائه شده توسط ResetPassword کلاس اعلان سفارشی کنید. این روش بسته شدنی را می پذیرد که نمونه کاربری دریافت کننده اعلان و همچنین رمز پیوند بازنشانی رمز عبور را دریافت می کند. به طور معمول، شما باید این روش را از روش App\Providers\AppServiceProvider ارائه دهنده خدمات خود فراخوانی کنید boot :

use App\Models\User;
use Illuminate\Auth\Notifications\ResetPassword;
 
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ResetPassword::createUrlUsing(function (User $user, string $token) {
return 'https://example.com/reset-password?token='.$token;
});
}

بازنشانی سفارشی سازی ایمیل

می‌توانید به راحتی کلاس اعلان مورد استفاده برای ارسال پیوند بازنشانی رمز عبور به کاربر را تغییر دهید. برای شروع، sendPasswordResetNotification روش مدل خود را لغو کنید App\Models\User . در این روش، می توانید اعلان را با استفاده از هر کلاس اعلان ایجاد شده توسط خودتان ارسال کنید. بازنشانی رمز عبور $token اولین آرگومان دریافت شده توسط متد است. می توانید از این $token برای ایجاد URL بازنشانی رمز عبور دلخواه خود و ارسال اعلان خود به کاربر استفاده کنید:

use App\Notifications\ResetPasswordNotification;
 
/**
* Send a password reset notification to the user.
*
* @param string $token
*/
public function sendPasswordResetNotification($token): void
{
$url = 'https://example.com/reset-password?token='.$token;
 
$this->notify(new ResetPasswordNotification($url));
}