ResetsPasswords.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. namespace Illuminate\Foundation\Auth;
  3. use Illuminate\Auth\Events\PasswordReset;
  4. use Illuminate\Http\JsonResponse;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Hash;
  8. use Illuminate\Support\Facades\Password;
  9. use Illuminate\Support\Str;
  10. use Illuminate\Validation\ValidationException;
  11. trait ResetsPasswords
  12. {
  13. use RedirectsUsers;
  14. /**
  15. * Display the password reset view for the given token.
  16. *
  17. * If no token is present, display the link request form.
  18. *
  19. * @param \Illuminate\Http\Request $request
  20. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  21. */
  22. public function showResetForm(Request $request)
  23. {
  24. $token = $request->route()->parameter('token');
  25. return view('auth.passwords.reset')->with(
  26. ['token' => $token, 'email' => $request->email]
  27. );
  28. }
  29. /**
  30. * Reset the given user's password.
  31. *
  32. * @param \Illuminate\Http\Request $request
  33. * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
  34. */
  35. public function reset(Request $request)
  36. {
  37. $request->validate($this->rules(), $this->validationErrorMessages());
  38. // Here we will attempt to reset the user's password. If it is successful we
  39. // will update the password on an actual user model and persist it to the
  40. // database. Otherwise we will parse the error and return the response.
  41. $response = $this->broker()->reset(
  42. $this->credentials($request), function ($user, $password) {
  43. $this->resetPassword($user, $password);
  44. }
  45. );
  46. // If the password was successfully reset, we will redirect the user back to
  47. // the application's home authenticated view. If there is an error we can
  48. // redirect them back to where they came from with their error message.
  49. return $response == Password::PASSWORD_RESET
  50. ? $this->sendResetResponse($request, $response)
  51. : $this->sendResetFailedResponse($request, $response);
  52. }
  53. /**
  54. * Get the password reset validation rules.
  55. *
  56. * @return array
  57. */
  58. protected function rules()
  59. {
  60. return [
  61. 'token' => 'required',
  62. 'email' => 'required|email',
  63. 'password' => 'required|confirmed|min:8',
  64. ];
  65. }
  66. /**
  67. * Get the password reset validation error messages.
  68. *
  69. * @return array
  70. */
  71. protected function validationErrorMessages()
  72. {
  73. return [];
  74. }
  75. /**
  76. * Get the password reset credentials from the request.
  77. *
  78. * @param \Illuminate\Http\Request $request
  79. * @return array
  80. */
  81. protected function credentials(Request $request)
  82. {
  83. return $request->only(
  84. 'email', 'password', 'password_confirmation', 'token'
  85. );
  86. }
  87. /**
  88. * Reset the given user's password.
  89. *
  90. * @param \Illuminate\Contracts\Auth\CanResetPassword $user
  91. * @param string $password
  92. * @return void
  93. */
  94. protected function resetPassword($user, $password)
  95. {
  96. $this->setUserPassword($user, $password);
  97. $user->setRememberToken(Str::random(60));
  98. $user->save();
  99. event(new PasswordReset($user));
  100. $this->guard()->login($user);
  101. }
  102. /**
  103. * Set the user's password.
  104. *
  105. * @param \Illuminate\Contracts\Auth\CanResetPassword $user
  106. * @param string $password
  107. * @return void
  108. */
  109. protected function setUserPassword($user, $password)
  110. {
  111. $user->password = Hash::make($password);
  112. }
  113. /**
  114. * Get the response for a successful password reset.
  115. *
  116. * @param \Illuminate\Http\Request $request
  117. * @param string $response
  118. * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
  119. */
  120. protected function sendResetResponse(Request $request, $response)
  121. {
  122. if ($request->wantsJson()) {
  123. return new JsonResponse(['message' => trans($response)], 200);
  124. }
  125. return redirect($this->redirectPath())
  126. ->with('status', trans($response));
  127. }
  128. /**
  129. * Get the response for a failed password reset.
  130. *
  131. * @param \Illuminate\Http\Request $request
  132. * @param string $response
  133. * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
  134. */
  135. protected function sendResetFailedResponse(Request $request, $response)
  136. {
  137. if ($request->wantsJson()) {
  138. throw ValidationException::withMessages([
  139. 'email' => [trans($response)],
  140. ]);
  141. }
  142. return redirect()->back()
  143. ->withInput($request->only('email'))
  144. ->withErrors(['email' => trans($response)]);
  145. }
  146. /**
  147. * Get the broker to be used during password reset.
  148. *
  149. * @return \Illuminate\Contracts\Auth\PasswordBroker
  150. */
  151. public function broker()
  152. {
  153. return Password::broker();
  154. }
  155. /**
  156. * Get the guard to be used during password reset.
  157. *
  158. * @return \Illuminate\Contracts\Auth\StatefulGuard
  159. */
  160. protected function guard()
  161. {
  162. return Auth::guard();
  163. }
  164. }