@Vova135798

Почему не работает восстановление пароля на сайте?

Почему-то не работает восстановление пароля, выдает, что ссылка устарела, хотя создана только что, и в базе есть запись для восстановления пароля. Токен и почта сходятся в базе и форме. Почему так происходит? Помогите, пожалуйста, найти ошибку.

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use App\Models\User;

class ResetPasswordController extends Controller
{
    public function __construct()
    {
        $this->middleware('guest');
    }

    public function form($token, $email){
        return view('auth.reset-password', compact('email', 'token'));
    }

    public function reset(Request $request) {
        $request->validate([
            'email' => 'required|email|exists:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
        // удаляем старые записи из таблицы сброса паролей
        $expire = Carbon::now()->subMinute(60);
        DB::table('password_resets')
            ->where('created_at', '<', $expire)
            ->delete();
        // если ссылка на восстановления была отправлена
        $row = DB::table('password_resets')
            ->where([
                'email' => $request->email,
                'token' => $request->token,
            ])
            ->first();
        // если ссылка уже устарела, то ничего не делаем
        if(!$row) {
            return back()->withErrors('Ссылка восстановления пароля устарела');
        }
        // устанавливаем новый пароль для пользователя
        User::where('email', $request->email)
            ->update(['password' => Hash::make($request->password)]);
        // удаляем пользователя из таблицы сброса паролей
        DB::table('password_resets')->where(['email'=> $request->email])->delete();

        return redirect()
            ->route('auth.login')
            ->with('success', 'Ваш пароль был успешно изменен');
    }
}
  • Вопрос задан
  • 188 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dsmoke
Возможно у вас нет токена в реквесте

'token' => $request->token

добавьте в валидатор 'token' => 'required', так как он является обязательным
$request->validate([
    'token' => 'required',
    'email' => 'required|email|exists:users',
    'password' => 'required|string|min:6|confirmed',
]);


почему не использовать Illuminate\Support\Facades\Password::reset() ?

https://laravel.com/docs/9.x/passwords#password-re...

upd
проблема с expire, subMinute() юзает одну минуту
$expire = Carbon::now()->subMinute(60);

надо так:
$expire = Carbon::now()->subMinutes(60);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы