feat: reset password
This commit is contained in:
@@ -13,6 +13,7 @@ use App\Models\User;
|
||||
use Illuminate\Auth\Events\PasswordReset;
|
||||
use Illuminate\Auth\Events\Verified;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Illuminate\Support\Arr;
|
||||
@@ -21,6 +22,7 @@ use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Password;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\ValidatedInput;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class AuthController extends Controller
|
||||
@@ -145,22 +147,7 @@ class AuthController extends Controller
|
||||
|
||||
public function resetPassword(ResetPasswordRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->validated();
|
||||
$data['email'] = strtolower($data['email']);
|
||||
|
||||
$status = Password::reset(
|
||||
$data,
|
||||
function (User $user, string $password): void {
|
||||
$user->forceFill([
|
||||
'password' => Hash::make($password),
|
||||
'remember_token' => Str::random(60),
|
||||
])->save();
|
||||
|
||||
$user->tokens()->delete();
|
||||
|
||||
event(new PasswordReset($user));
|
||||
}
|
||||
);
|
||||
$status = $this->resetPasswordFor($request->safe());
|
||||
|
||||
if ($status !== Password::PASSWORD_RESET) {
|
||||
return response()->json([
|
||||
@@ -173,6 +160,34 @@ class AuthController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function showResetPasswordForm(Request $request, string $token): View
|
||||
{
|
||||
return view('auth.reset-password', [
|
||||
'appName' => config('app.name'),
|
||||
'email' => (string) $request->query('email', ''),
|
||||
'passwordReset' => false,
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
|
||||
public function resetPasswordFromView(ResetPasswordRequest $request): RedirectResponse|View
|
||||
{
|
||||
$status = $this->resetPasswordFor($request->safe());
|
||||
|
||||
if ($status !== Password::PASSWORD_RESET) {
|
||||
return back()
|
||||
->withInput($request->only('email'))
|
||||
->withErrors(['email' => __($status)]);
|
||||
}
|
||||
|
||||
return view('auth.reset-password', [
|
||||
'appName' => config('app.name'),
|
||||
'email' => strtolower($request->validated('email')),
|
||||
'passwordReset' => true,
|
||||
'token' => '',
|
||||
]);
|
||||
}
|
||||
|
||||
public function logout(): JsonResponse
|
||||
{
|
||||
$request = request();
|
||||
@@ -263,6 +278,26 @@ class AuthController extends Controller
|
||||
return filled($path) && ! Str::startsWith($path, ['http://', 'https://']);
|
||||
}
|
||||
|
||||
private function resetPasswordFor(ValidatedInput $data): string
|
||||
{
|
||||
$credentials = $data->all();
|
||||
$credentials['email'] = strtolower($credentials['email']);
|
||||
|
||||
return Password::reset(
|
||||
$credentials,
|
||||
function (User $user, string $password): void {
|
||||
$user->forceFill([
|
||||
'password' => Hash::make($password),
|
||||
'remember_token' => Str::random(60),
|
||||
])->save();
|
||||
|
||||
$user->tokens()->delete();
|
||||
|
||||
event(new PasswordReset($user));
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
* @return array<string, mixed>
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Mail\Mailables\Content;
|
||||
use Illuminate\Mail\Mailables\Envelope;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class ResetPasswordMail extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct(
|
||||
public User $user,
|
||||
public string $resetUrl,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Get the message envelope.
|
||||
*/
|
||||
public function envelope(): Envelope
|
||||
{
|
||||
return new Envelope(
|
||||
subject: 'Réinitialise ton mot de passe Bowli',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the message content definition.
|
||||
*/
|
||||
public function content(): Content
|
||||
{
|
||||
return new Content(
|
||||
view: 'emails.reset-password',
|
||||
with: [
|
||||
'expiresInMinutes' => (int) config('auth.passwords.users.expire', 60),
|
||||
'resetUrl' => $this->resetUrl,
|
||||
'userName' => $this->user->name,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attachments for the message.
|
||||
*
|
||||
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
|
||||
*/
|
||||
public function attachments(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Providers;
|
||||
|
||||
use App\Broadcasting\ExpoPushChannel;
|
||||
use App\Mail\ResetPasswordMail;
|
||||
use App\Mail\VerifyAccount;
|
||||
use App\Models\User;
|
||||
use Illuminate\Auth\Notifications\ResetPassword;
|
||||
@@ -62,15 +63,19 @@ class AppServiceProvider extends ServiceProvider
|
||||
->to($notifiable->getEmailForVerification())
|
||||
);
|
||||
|
||||
ResetPassword::createUrlUsing(function (User $notifiable, string $token): string {
|
||||
$passwordResetUrl = rtrim((string) config('services.mobile.password_reset_url'), '?&');
|
||||
$query = http_build_query([
|
||||
$passwordResetUrl = function (User $notifiable, string $token): string {
|
||||
return route('password.reset', [
|
||||
'email' => $notifiable->getEmailForPasswordReset(),
|
||||
'token' => $token,
|
||||
], '', '&', PHP_QUERY_RFC3986);
|
||||
]);
|
||||
};
|
||||
|
||||
return "{$passwordResetUrl}?{$query}";
|
||||
});
|
||||
ResetPassword::createUrlUsing($passwordResetUrl);
|
||||
|
||||
ResetPassword::toMailUsing(
|
||||
fn (User $notifiable, string $token): ResetPasswordMail => (new ResetPasswordMail($notifiable, $passwordResetUrl($notifiable, $token)))
|
||||
->to($notifiable->getEmailForPasswordReset())
|
||||
);
|
||||
|
||||
Gate::define('viewApiDocs', function ($user = null) {
|
||||
// Option A : Autoriser tout le monde (Attention : la doc sera publique hors local)
|
||||
|
||||
Reference in New Issue
Block a user