Skip to content

Commit cefb3df

Browse files
committed
Adding updates to 2fa
1 parent 347eda0 commit cefb3df

File tree

4 files changed

+42
-31
lines changed

4 files changed

+42
-31
lines changed

app/Http/Controllers/Auth/AuthenticatedSessionController.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,18 @@ public function create(Request $request): Response
2929
*/
3030
public function store(LoginRequest $request): RedirectResponse
3131
{
32-
$request->authenticate();
32+
// Find user by email
33+
$user = \App\Models\User::where('email', $request->email)->first();
34+
35+
// If user has 2FA enabled and confirmed, redirect to challenge
36+
if ($user && $user->two_factor_confirmed_at) {
37+
$request->session()->put('login.id', $user->getKey());
38+
$request->session()->put('login.remember', $request->boolean('remember'));
39+
return redirect()->route('two-factor.challenge');
40+
}
3341

42+
// Proceed with normal authentication
43+
$request->authenticate();
3444
$request->session()->regenerate();
3545

3646
return redirect()->intended(route('dashboard', absolute: false));

app/Http/Controllers/Auth/TwoFactorAuthenticatedSessionController.php

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class TwoFactorAuthenticatedSessionController extends Controller
2222
*/
2323
public function create(Request $request)
2424
{
25-
if (! $request->session()->has('auth.two_factor_user_id')) {
25+
if (! $request->session()->has('login.id')) {
2626
return redirect()->route('login');
2727
}
2828

@@ -42,41 +42,42 @@ public function store(Request $request)
4242
'recovery_code' => 'nullable|string',
4343
]);
4444

45-
$user = Auth::loginUsingId($request->session()->pull('auth.two_factor_user_id'));
45+
$userId = $request->session()->get('login.id');
46+
$user = \App\Models\User::find($userId);
4647

47-
if ($request->filled('code')) {
48-
$request->session()->put([
49-
'login.id' => $user->getKey(),
50-
'login.remember' => $request->session()->pull('auth.two_factor_remember'),
51-
]);
52-
53-
$result = app(ConfirmTwoFactorAuthentication::class)(
54-
$request->user(),
55-
$request->code
56-
);
48+
if (! $user) {
49+
return redirect()->route('login');
50+
}
5751

58-
if ($result) {
59-
$request->session()->forget('login');
60-
return redirect()->intended(route('dashboard'));
52+
// Handle TOTP code
53+
if ($request->filled('code')) {
54+
$secret = decrypt($user->two_factor_secret);
55+
$valid = app(\App\Actions\TwoFactorAuth\VerifyTwoFactorCode::class)($secret, $request->code);
56+
if ($valid) {
57+
Auth::login($user, $request->session()->get('login.remember', false));
58+
$request->session()->regenerate();
59+
$request->session()->forget(['login.id', 'login.remember']);
60+
return redirect()->intended(route('dashboard', absolute: false));
6161
}
62-
6362
return back()->withErrors(['code' => __('The provided two factor authentication code was invalid.')]);
6463
}
6564

65+
// Handle recovery code
6666
if ($request->filled('recovery_code')) {
67-
$recovery = collect($user->recoveryCodes())->first(function ($code) use ($request) {
68-
return hash_equals($code, $request->recovery_code);
67+
$recoveryCodes = $user->recoveryCodes();
68+
$provided = $request->recovery_code;
69+
$match = collect($recoveryCodes)->first(function ($code) use ($provided) {
70+
return hash_equals($code, $provided);
6971
});
70-
71-
if (! $recovery) {
72+
if (! $match) {
7273
return back()->withErrors(['recovery_code' => __('The provided two factor authentication recovery code was invalid.')]);
7374
}
74-
75-
$user->replaceRecoveryCode($recovery);
76-
77-
$request->session()->forget('login');
78-
79-
return redirect()->intended(route('dashboard'));
75+
// Remove used recovery code
76+
$user->replaceRecoveryCode($match);
77+
Auth::login($user, $request->session()->get('login.remember', false));
78+
$request->session()->regenerate();
79+
$request->session()->forget(['login.id', 'login.remember']);
80+
return redirect()->intended(route('dashboard', absolute: false));
8081
}
8182

8283
return back()->withErrors(['code' => __('Please provide a valid two factor authentication code.')]);

resources/js/pages/auth/two-factor-challenge.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ export default function TwoFactorChallenge() {
1818

1919
const submitCode = (e: React.FormEvent) => {
2020
e.preventDefault();
21-
post(route('two-factor.login'));
21+
post(route('two-factor.challenge'));
2222
};
2323

2424
const submitRecoveryCode = (e: React.FormEvent) => {
2525
e.preventDefault();
26-
post(route('two-factor.login'));
26+
post(route('two-factor.challenge'));
2727
};
2828

2929
return (

routes/auth.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
Route::post('login', [AuthenticatedSessionController::class, 'store']);
2424

2525
Route::get('two-factor-challenge', [TwoFactorAuthenticatedSessionController::class, 'create'])
26-
->name('two-factor.login');
27-
26+
->name('two-factor.challenge');
27+
2828
Route::post('two-factor-challenge', [TwoFactorAuthenticatedSessionController::class, 'store']);
2929

3030
Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])

0 commit comments

Comments
 (0)