Маршрут для сброса пароля в Laravel 7

#laravel

#laravel

Вопрос:

Я использую пользовательскую опцию сброса пароля в Laravel 7. Когда пользователь нажимает кнопку сброса пароля (в папке «Входящие» своего электронного письма), пользователь перенаправляется на ссылку для сброса пароля. Вот моя ссылка

http://localhost/LaraTest/public/reset/5199667639cfc4f5ea624f4c18dbf7e8-vJcnLSH92vAj1IlnV3j7phT8zBtcbX0gSDbjXX37oFsuEM560oAiehZ4oVd0?email=basish@gmail.com

Вот код, который генерирует ссылку

 $token1=   md5($fp_email);
    $token2 =   Str::random(60);
    $fp_token = $token1."-".$token2;
//some more codes here
$link = 'localhost/LaraTest/public/reset/' . $fp_token . '?email=' . urlencode($fp_email);

//$link is sent to user as email 
  

Маршрут (после некоторого исследования)

 Route::get('reset/{tokenname}{email}','LoginController@resetpassword');
  

Контроллер

 public function resetpassword(Request $request){
     
     return view('resetpassword');
     
}
  
  1. Как бы я определил свой маршрут? Я немного смущен, поскольку моя ссылка содержит
    как токен сброса пароля, так и идентификатор электронной почты.
  2. Как я получу токен сброса пароля и идентификатор электронной почты по ссылке выше после перенаправления на новую форму пароля?

Комментарии:

1. что вы пробовали до сих пор?

2. @KamleshPaul У меня нет. потому что я понятия не имею

3. в противном случае я бы упомянул в самом вопросе

4. Вместо того, чтобы показывать нам, как вы создаете эту ссылку (которая, я полагаю, работает), почему бы не показать нам, что вы пробовали до сих пор при определении маршрута? Вероятно, вы можете получить доступ $request->email к параметру электронной почты из этого маршрута и использовать его, чтобы получить пользователя вместе с его токенами сброса пароля. Вы пытались это сделать?

5. @KamleshPaul Я обновил свой ответ routes и controller

Ответ №1:

Ваш маршрут должен быть:

 Route::get('reset/{tokenname}','LoginController@resetpassword');
  

Затем фактический обработчик:

 public function resetpassword(Request $request, $token){     
     $email = $request->email;
     return view('resetpassword', compact('token', 'email');    
}
  

Тогда, по вашему мнению, вы можете иметь:

     <input type="hidden" name="email" value="{{$email}}" />
    <input type="hidden" name="token" value="{{$token}}" />
  

и ваш фактический обработчик сброса пароля, вероятно, будет определен в маршруте, подобном:

 Route::post('reset', 'LoginController@doPasswordReset');
  

и тело метода будет (код, заимствованный в некоторой части из источника laravel):

 public function doPasswordReset(Request $request){   
     $validatedRequest = $request->validate([
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed|min:8',
        ]);  
     $email = $request->email;
     $token = $request->token;
     $broker = app(PasswordBrokerManager::class);
     
     $response = $broker()->reset(
            $validatedRequest, function ($user, $password) {
                 // save new password here
            }
        );

        return $response == Password::PASSWORD_RESET
                    ? // Reset response?
                    : // Reset failed response?
}
  

Это гарантирует, что Laravel сможет подтвердить пользователя по предоставленному адресу электронной почты и паролю, прежде чем выполнять фактический сброс пароля.

Комментарии:

1. Теперь я понял. Значение токена равно 5199667639cfc4f5ea624f4c18dbf7e8-vJcnLSH92vAj1IlnV3j7phT8zBtcbX0gSDbjXX37oFsuEM560oAiehZ4oVd0?email=basish@gmail.com . Я хотел разделить токен и электронную почту следующим образом токен = * 5199667639cfc4f5ea624f4c18dbf7e8-vJcnLSH92vAj1IlnV3j7phT8zBtcbX0gSDbjXX37oFsuEM560oAiehZ4oVd0 * и электронная почта = basish@gmail.com