Чтобы написать собственную логику сброса пароля, вы все равно можете использовать миграцию по умолчанию, которая выходит из коробки или просто создает вашу. Важнейшая часть - это токен. Поскольку вы делаете свой собственный сброс пароля, вы должны принять несколько решений:
- Будет ли срок годности?
- Можете ли вы использовать один и тот же токен несколько раз?
Вам понадобится 2 страницы, 4 разных маршрута и 4 различных функции в одном контроллере. Страница «Я забыл пароль» и страницу «Сбросить пароль». На первой странице отобразите форму, в которой вы берете электронную почту пользователя. Отправьте сообщение следующему контроллеру.
//to be added on top as use statements
use DB;
use Auth;
use Hash;
use Carbon;
use App\User;
public function sendPasswordResetToken(Request $request)
{
$user = User::where ('email', $request->email)-first();
if (!$user) return redirect()->back()->withErrors(['error' => '404']);
//create a new token to be sent to the user.
DB::table('password_resets')->insert([
'email' => $request->email,
'token' => str_random(60), //change 60 to any length you want
'created_at' => Carbon::now()
]);
$tokenData = DB::table('password_resets')
->where('email', $request->email)->first();
$token = $tokenData->token;
$email = $request->email; // or $email = $tokenData->email;
/**
* Send email to the email above with a link to your password reset
* something like url('password-reset/' . $token)
* Sending email varies according to your Laravel version. Very easy to implement
*/
}
Вторая часть, когда пользователь нажимает на ссылку
/**
* Assuming the URL looks like this
* http://localhost/password-reset/random-string-here
* You check if the user and the token exist and display a page
*/
public function showPasswordResetForm($token)
{
$tokenData = DB::table('password_resets')
->where('token', $token)->first();
if (!$tokenData) return redirect()->to('home'); //redirect them anywhere you want if the token does not exist.
return view('passwords.show');
}
отобразить страницу с формой, содержащей 2 входа - Новый пароль password
или whateveer вы хотите - Новое подтверждение пароля password_confirm
или любой другой вы хотите Форма должна размещаться на том же URL-адресе, отображаемом на следующий контроллер. Зачем? потому что нам все равно нужно использовать токен, чтобы найти фактического пользователя.
public function resetPassword(Request $request, $token)
{
//some validation
...
$password = $request->password;
$tokenData = DB::table('password_resets')
->where('token', $token)->first();
$user = User::where('email', $tokenData->email)->first();
if (!$user) return redirect()->to('home'); //or wherever you want
$user->password = Hash::make($password);
$user->update(); //or $user->save();
//do we log the user directly or let them login and try their password for the first time ? if yes
Auth::login($user);
// If the user shouldn't reuse the token later, delete the token
DB::table('password_resets')->where('email', $user->email')->delete();
//redirect where we want according to whether they are logged in or not.
}
Не забудьте добавить маршруты
Route::get('password-reset', '[email protected]'); //I did not create this controller. it simply displays a view with a form to take the email
Route::post('password-reset', '[email protected]');
Route::get('reset-password/{token}', '[email protected]');
Route::post('reset-password/{token}', '[email protected]');
Примечание: Там могут быть опечатки или синтаксические ошибки, потому что я не проверял это и написал здесь прямо из верхней части моей головы. Если вы видите ошибку/исключение, не паникуйте, прочитайте ошибку и выполните поиск в Google.
Я не вижу никакого «драйвера» в 'config/app.php'.Но я могу помочь вам с пользовательским сбросом пароля, если вам все еще нужно. – EddyTheDove
Неплохо, это были 'config/auth.php', а не' config/app.php', что были указаны параметры драйвера. Я исправлю сообщение. Помощь с пользовательским сбросом пароля была бы высоко оценена. –