Скидання паролів
Вступ
Більшість веб-програм надають користувачам можливість скинути свої забуті паролі. Замість того, щоб змушувати вас повторно впроваджувати це в кожній програмі, Laravel пропонує зручні методи надсилання нагадувань про паролі та скидання паролів.
Хочете швидко розпочати? ВстановитиLaravel Jetstreamу свіжому додатку Laravel. Після міграції бази даних перейдіть до браузера/register
або будь-яка інша URL-адреса, призначена вашій програмі. Jetstream подбає про побудову всієї вашої системи автентифікації, включаючи скидання паролів!
Підготовка моделі
Перш ніж використовувати функції скидання пароля Laravel, вашApp\Models\User
модель повинна використовуватиIlluminate\Notifications\Notifiable
риса. Як правило, ця риса автоматично включається за замовчуваннямApp\Models\User
модель, що входить до комплекту Laravel.
Далі переконайтеся, що вашApp\Models\User
модель реалізуєIlluminate\Contracts\Auth\CanResetPassword
контракт.App\Models\User
Модель, що входить до фреймворку, вже реалізує цей інтерфейс і використовуєIlluminate\Auth\Passwords\CanResetPassword
ознака включати методи, необхідні для реалізації інтерфейсу.
Підготовка бази даних
Потрібно створити таблицю, щоб зберігати маркери скидання пароля вашої програми. Міграція для цієї таблиці включена до інсталяції Laravel за замовчуванням, тому вам потрібно лише перенести вашу базу даних, щоб створити цю таблицю:
php artisan migrate
Routing
Щоб належним чином реалізувати підтримку, яка дозволяє користувачам скидати свої паролі, нам потрібно буде визначити кілька маршрутів. По-перше, нам знадобиться пара маршрутів для обробки, що дозволяють користувачеві запитувати посилання для скидання пароля через свою електронну адресу. По-друге, нам знадобиться пара маршрутів для фактичного скидання пароля після того, як користувач відвідає посилання для скидання пароля, яке йому надіслано електронною поштою.
Запит на посилання для скидання пароля
Форма запиту на посилання для скидання пароля
Спочатку ми визначимо маршрути, необхідні для запиту посилань на скидання пароля. Для початку ми визначимо маршрут, який повертає View з формою запиту на посилання для скидання пароля:
Route::get('/forgot-password', function () {
return view('auth.forgot-password');
})->middleware(['guest'])->name('password.request');
Шаблон, який повертається цим маршрутом, повинен мати форму, що міститьemail
поле, яке дозволить користувачеві запитувати посилання на скидання пароля для даної адреси електронної пошти.
Обробка View форми
Далі ми визначимо, що маршрут буде обробляти запит форми з View "забутий пароль". Цей маршрут буде відповідальним за перевірку електронної адреси та надсилання запиту на скидання пароля відповідному користувачеві:
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
атрибут перевірено. Далі ми використовуватимемо вбудований "посередник паролів" Laravel (черезPassword
фасад), щоб надіслати користувачеві посилання на скидання пароля. Брокер паролів подбає про те, щоб отримати користувача за даним полем (в даному випадку електронною адресою) і надіслати користувачеві посилання для скидання пароля через вбудований Laravelсистема Notification.
sendResetLink
метод повертає "статус" кулі. Цей статус може бути перекладений за допомогою Laravelлокалізаціяпомічники для того, щоб показати зручне повідомлення користувачеві про стан його запиту. Переклад статусу скидання пароля визначається вашим додаткомresources/lang/{lang}/passwords.php
мовний файл. Запис для кожного можливого значення зливу стану знаходиться в межахpasswords
мовний файл.
При ручному виконанні скидання пароля потрібно визначити вміст Views та маршрутів самостійно. Якщо ви хочете риштування, яке включає всю необхідну логіку автентифікації та перевірки, перевіртеLaravel Jetstream.
Скидання пароля
Форма скидання пароля
Далі ми визначимо маршрути, необхідні для фактичного скидання пароля після того, як користувач натисне посилання для скидання пароля, яке було надіслане йому електронною поштою та надає новий пароль. Спочатку визначимо маршрут, який буде відображати форму скидання пароля, яка відображається, коли користувач натискає посилання скидання пароля. Цей маршрут отримаєtoken
параметр, який ми будемо використовувати пізніше для перевірки запиту на скидання пароля:
Route::get('/reset-password/{token}', function ($token) {
return view('auth.reset-password', ['token' => $token]);
})->middleware(['guest'])->name('password.reset');
Вигляд, який повертається цим маршрутом, повинен мати форму, що міститьemail
поле, apassword
поле, apassword_confirmation
поле, і прихованеtoken
поле, яке повинно містити значення секретного маркера, отриманого нашим маршрутом.
Обробка View форми
Звичайно, нам потрібно визначити маршрут, який фактично обробляє View форми для скидання пароля. Цей маршрут буде відповідальним за перевірку вхідного запиту та оновлення пароля користувача в базі даних:
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, $password) use ($request) {
$user->forceFill([
'password' => Hash::make($password)
])->save();
$user->setRememberToken(Str::random(60));
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
атрибути перевірені. Далі ми використовуватимемо вбудований "посередник паролів" Laravel (черезPassword
фасад) для перевірки облікових даних запиту на скидання пароля.
Якщо маркер, адреса електронної пошти та пароль, надані посереднику паролів, є дійсними, Закриття передається доreset
буде викликаний метод. В рамках цього Закриття, яке отримує екземпляр користувача та пароль простого тексту, ми можемо оновити пароль користувача в базі даних.
reset
метод повертає "статус" кулі. Цей статус може бути перекладений за допомогою Laravelлокалізаціяпомічники для того, щоб показати зручне повідомлення користувачеві про стан його запиту. Переклад статусу скидання пароля визначається вашим додаткомresources/lang/{lang}/passwords.php
мовний файл. Запис для кожного можливого значення зливу стану знаходиться в межахpasswords
мовний файл.
Налаштування
Скинути налаштування посилання
Ви можете налаштувати URL-адресу посилання для скидання пароля за допомогоюcreateUrlUsing
метод, передбаченийResetPassword
клас повідомлення. Цей метод приймає Закриття, яке отримує екземпляр користувача, який отримує повідомлення, а також маркер посилання на скидання пароля. Як правило, вам слід викликати цей метод у постачальника послугboot
метод:
use Illuminate\Auth\Notifications\ResetPassword;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
ResetPassword::createUrlUsing(function ($notifiable, string $token) {
return 'https://example.com/auth/reset-password?token='.$token;
});
}
Скинути налаштування електронної пошти
Ви можете легко змінити клас Notification, який використовується для надсилання користувачеві посилання на скидання пароля. Для початку перевизначтеsendPasswordResetNotification
метод на вашомуUser
модель. За допомогою цього методу ви можете надсилати Notification, використовуючи будь-який вибраний вами клас сповіщень. Скидання пароля$token
є першим аргументом, отриманим методом:
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}