Route::has('password.request'), 'status' => $request->session()->get('status'), ]); } #[Post('login', name: 'login', middleware: 'guest')] public function store(Request $request): RedirectResponse { $this->validate($request, [ 'email' => ['required', 'string', 'email'], 'password' => ['required', 'string'], ]); $this->ensureIsNotRateLimited(); if (! Auth::attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) { RateLimiter::hit($this->throttleKey()); throw ValidationException::withMessages([ 'email' => __('auth.failed'), ]); } RateLimiter::clear($this->throttleKey()); Session::regenerate(); return redirect()->intended(route('servers', absolute: false)); } #[Post('logout', name: 'logout', middleware: 'auth')] public function destroy(Request $request): RedirectResponse { Auth::guard('web')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } protected function ensureIsNotRateLimited(): void { if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { return; } event(new Lockout(request())); $seconds = RateLimiter::availableIn($this->throttleKey()); throw ValidationException::withMessages([ 'email' => __('auth.throttle', [ 'seconds' => $seconds, 'minutes' => ceil($seconds / 60), ]), ]); } protected function throttleKey(): string { return Str::transliterate(Str::lower(request()->email).'|'.request()->ip()); } }