|
0
|
1 <?php
|
|
|
2
|
|
|
3 namespace App\Http\Requests\Auth;
|
|
|
4
|
|
|
5 use Illuminate\Auth\Events\Lockout;
|
|
|
6 use Illuminate\Foundation\Http\FormRequest;
|
|
|
7 use Illuminate\Support\Facades\Auth;
|
|
|
8 use Illuminate\Support\Facades\RateLimiter;
|
|
|
9 use Illuminate\Support\Str;
|
|
|
10 use Illuminate\Validation\ValidationException;
|
|
|
11
|
|
|
12 class LoginRequest extends FormRequest
|
|
|
13 {
|
|
|
14 /**
|
|
|
15 * Determine if the user is authorized to make this request.
|
|
|
16 */
|
|
|
17 public function authorize(): bool
|
|
|
18 {
|
|
|
19 return true;
|
|
|
20 }
|
|
|
21
|
|
|
22 /**
|
|
|
23 * Get the validation rules that apply to the request.
|
|
|
24 *
|
|
|
25 * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
|
|
26 */
|
|
|
27 public function rules(): array
|
|
|
28 {
|
|
|
29 return [
|
|
|
30 'email' => ['required', 'string', 'email'],
|
|
|
31 'password' => ['required', 'string'],
|
|
|
32 ];
|
|
|
33 }
|
|
|
34
|
|
|
35 /**
|
|
|
36 * Attempt to authenticate the request's credentials.
|
|
|
37 *
|
|
|
38 * @throws \Illuminate\Validation\ValidationException
|
|
|
39 */
|
|
|
40 public function authenticate(): void
|
|
|
41 {
|
|
|
42 $this->ensureIsNotRateLimited();
|
|
|
43
|
|
|
44 if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
|
|
|
45 RateLimiter::hit($this->throttleKey());
|
|
|
46
|
|
|
47 throw ValidationException::withMessages([
|
|
|
48 'email' => trans('auth.failed'),
|
|
|
49 ]);
|
|
|
50 }
|
|
|
51
|
|
|
52 RateLimiter::clear($this->throttleKey());
|
|
|
53 }
|
|
|
54
|
|
|
55 /**
|
|
|
56 * Ensure the login request is not rate limited.
|
|
|
57 *
|
|
|
58 * @throws \Illuminate\Validation\ValidationException
|
|
|
59 */
|
|
|
60 public function ensureIsNotRateLimited(): void
|
|
|
61 {
|
|
|
62 if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
|
|
|
63 return;
|
|
|
64 }
|
|
|
65
|
|
|
66 event(new Lockout($this));
|
|
|
67
|
|
|
68 $seconds = RateLimiter::availableIn($this->throttleKey());
|
|
|
69
|
|
|
70 throw ValidationException::withMessages([
|
|
|
71 'email' => trans('auth.throttle', [
|
|
|
72 'seconds' => $seconds,
|
|
|
73 'minutes' => ceil($seconds / 60),
|
|
|
74 ]),
|
|
|
75 ]);
|
|
|
76 }
|
|
|
77
|
|
|
78 /**
|
|
|
79 * Get the rate limiting throttle key for the request.
|
|
|
80 */
|
|
|
81 public function throttleKey(): string
|
|
|
82 {
|
|
|
83 return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip());
|
|
|
84 }
|
|
|
85 }
|