Skip to content

Commit a7e4ee9

Browse files
committed
add brezze
1 parent 577f360 commit a7e4ee9

30 files changed

+683
-136
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Auth\LoginRequest;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Http\Response;
9+
use Illuminate\Support\Facades\Auth;
10+
11+
class AuthenticatedSessionController extends Controller
12+
{
13+
/**
14+
* Handle an incoming authentication request.
15+
*/
16+
public function store(LoginRequest $request): Response
17+
{
18+
$request->authenticate();
19+
20+
$request->session()->regenerate();
21+
22+
return response()->noContent();
23+
}
24+
25+
/**
26+
* Destroy an authenticated session.
27+
*/
28+
public function destroy(Request $request): Response
29+
{
30+
Auth::guard('web')->logout();
31+
32+
$request->session()->invalidate();
33+
34+
$request->session()->regenerateToken();
35+
36+
return response()->noContent();
37+
}
38+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Providers\RouteServiceProvider;
7+
use Illuminate\Http\JsonResponse;
8+
use Illuminate\Http\RedirectResponse;
9+
use Illuminate\Http\Request;
10+
11+
class EmailVerificationNotificationController extends Controller
12+
{
13+
/**
14+
* Send a new email verification notification.
15+
*/
16+
public function store(Request $request): JsonResponse|RedirectResponse
17+
{
18+
if ($request->user()->hasVerifiedEmail()) {
19+
return redirect()->intended(RouteServiceProvider::HOME);
20+
}
21+
22+
$request->user()->sendEmailVerificationNotification();
23+
24+
return response()->json(['status' => 'verification-link-sent']);
25+
}
26+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use Illuminate\Auth\Events\PasswordReset;
7+
use Illuminate\Http\JsonResponse;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\Hash;
10+
use Illuminate\Support\Facades\Password;
11+
use Illuminate\Support\Str;
12+
use Illuminate\Validation\Rules;
13+
use Illuminate\Validation\ValidationException;
14+
15+
class NewPasswordController extends Controller
16+
{
17+
/**
18+
* Handle an incoming new password request.
19+
*
20+
* @throws \Illuminate\Validation\ValidationException
21+
*/
22+
public function store(Request $request): JsonResponse
23+
{
24+
$request->validate([
25+
'token' => ['required'],
26+
'email' => ['required', 'email'],
27+
'password' => ['required', 'confirmed', Rules\Password::defaults()],
28+
]);
29+
30+
// Here we will attempt to reset the user's password. If it is successful we
31+
// will update the password on an actual user model and persist it to the
32+
// database. Otherwise we will parse the error and return the response.
33+
$status = Password::reset(
34+
$request->only('email', 'password', 'password_confirmation', 'token'),
35+
function ($user) use ($request) {
36+
$user->forceFill([
37+
'password' => Hash::make($request->password),
38+
'remember_token' => Str::random(60),
39+
])->save();
40+
41+
event(new PasswordReset($user));
42+
}
43+
);
44+
45+
if ($status != Password::PASSWORD_RESET) {
46+
throw ValidationException::withMessages([
47+
'email' => [__($status)],
48+
]);
49+
}
50+
51+
return response()->json(['status' => __($status)]);
52+
}
53+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use Illuminate\Http\JsonResponse;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Support\Facades\Password;
9+
use Illuminate\Validation\ValidationException;
10+
11+
class PasswordResetLinkController extends Controller
12+
{
13+
/**
14+
* Handle an incoming password reset link request.
15+
*
16+
* @throws \Illuminate\Validation\ValidationException
17+
*/
18+
public function store(Request $request): JsonResponse
19+
{
20+
$request->validate([
21+
'email' => ['required', 'email'],
22+
]);
23+
24+
// We will send the password reset link to this user. Once we have attempted
25+
// to send the link, we will examine the response then see the message we
26+
// need to show to the user. Finally, we'll send out a proper response.
27+
$status = Password::sendResetLink(
28+
$request->only('email')
29+
);
30+
31+
if ($status != Password::RESET_LINK_SENT) {
32+
throw ValidationException::withMessages([
33+
'email' => [__($status)],
34+
]);
35+
}
36+
37+
return response()->json(['status' => __($status)]);
38+
}
39+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Models\User;
7+
use Illuminate\Auth\Events\Registered;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Http\Response;
10+
use Illuminate\Support\Facades\Auth;
11+
use Illuminate\Support\Facades\Hash;
12+
use Illuminate\Validation\Rules;
13+
14+
class RegisteredUserController extends Controller
15+
{
16+
/**
17+
* Handle an incoming registration request.
18+
*
19+
* @throws \Illuminate\Validation\ValidationException
20+
*/
21+
public function store(Request $request): Response
22+
{
23+
$request->validate([
24+
'name' => ['required', 'string', 'max:255'],
25+
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
26+
'password' => ['required', 'confirmed', Rules\Password::defaults()],
27+
]);
28+
29+
$user = User::create([
30+
'name' => $request->name,
31+
'email' => $request->email,
32+
'password' => Hash::make($request->password),
33+
]);
34+
35+
event(new Registered($user));
36+
37+
Auth::login($user);
38+
39+
return response()->noContent();
40+
}
41+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Auth;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Providers\RouteServiceProvider;
7+
use Illuminate\Auth\Events\Verified;
8+
use Illuminate\Foundation\Auth\EmailVerificationRequest;
9+
use Illuminate\Http\RedirectResponse;
10+
11+
class VerifyEmailController extends Controller
12+
{
13+
/**
14+
* Mark the authenticated user's email address as verified.
15+
*/
16+
public function __invoke(EmailVerificationRequest $request): RedirectResponse
17+
{
18+
if ($request->user()->hasVerifiedEmail()) {
19+
return redirect()->intended(
20+
config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1'
21+
);
22+
}
23+
24+
if ($request->user()->markEmailAsVerified()) {
25+
event(new Verified($request->user()));
26+
}
27+
28+
return redirect()->intended(
29+
config('app.frontend_url').RouteServiceProvider::HOME.'?verified=1'
30+
);
31+
}
32+
}

app/Http/Kernel.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Kernel extends HttpKernel
3939
],
4040

4141
'api' => [
42-
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
42+
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
4343
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
4444
\Illuminate\Routing\Middleware\SubstituteBindings::class,
4545
],
@@ -62,6 +62,6 @@ class Kernel extends HttpKernel
6262
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
6363
'signed' => \App\Http\Middleware\ValidateSignature::class,
6464
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
65-
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
65+
'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class,
6666
];
6767
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace App\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Contracts\Auth\MustVerifyEmail;
7+
use Illuminate\Http\Request;
8+
use Symfony\Component\HttpFoundation\Response;
9+
10+
class EnsureEmailIsVerified
11+
{
12+
/**
13+
* Handle an incoming request.
14+
*
15+
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
16+
*/
17+
public function handle(Request $request, Closure $next): Response
18+
{
19+
if (! $request->user() ||
20+
($request->user() instanceof MustVerifyEmail &&
21+
! $request->user()->hasVerifiedEmail())) {
22+
return response()->json(['message' => 'Your email address is not verified.'], 409);
23+
}
24+
25+
return $next($request);
26+
}
27+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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\Rule|array|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' => __('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->input('email')).'|'.$this->ip());
84+
}
85+
}

0 commit comments

Comments
 (0)