#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. @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