بازنشانی رمزهای عبور
معرفی
اکثر برنامه های کاربردی وب راهی را برای کاربران فراهم می کنند تا رمزهای عبور فراموش شده خود را بازنشانی کنند. لاراول به جای اینکه شما را مجبور کند که برای هر برنامهای که ایجاد میکنید مجدداً این کار را با دست پیادهسازی کنید، خدمات مناسبی برای ارسال پیوندهای بازنشانی رمز عبور و بازنشانی رمزهای عبور امن ارائه میدهد.
می خواهید سریع شروع کنید؟ یک کیت شروع برنامه لاراول را در یک برنامه جدید لاراول نصب کنید. کیت های شروع لاراول از داربست کل سیستم احراز هویت شما، از جمله بازنشانی رمزهای عبور فراموش شده، مراقبت می کند.
آماده سازی مدل
قبل از استفاده از ویژگی های بازنشانی رمز عبور لاراول،
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));}