Skip to content

Commit 62ffcd8

Browse files
jasonvargaclaude
andcommitted
Forget login session keys after successful 2FA challenge
login.id and login.remember were migrated through session regenerate and never consumed. Cleaning them up prevents the challenge form tag (which gates on login.id presence) from rendering for a user who has already authenticated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 315031b commit 62ffcd8

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

src/Http/Controllers/TwoFactorChallengeController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public function store(TwoFactorChallengeRequest $request)
5252

5353
Auth::guard()->login($user, $request->remember());
5454

55+
$request->session()->forget(['login.id', 'login.remember']);
56+
5557
$request->session()->elevate();
5658

5759
$request->session()->regenerate();

tests/Tags/User/TwoFactorChallengeFormTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,22 @@ public function it_completes_challenge_and_redirects()
9090
$this->assertAuthenticatedAs($user);
9191
}
9292

93+
#[Test]
94+
public function it_clears_login_session_keys_after_successful_challenge()
95+
{
96+
$user = $this->userWithTwoFactorEnabled();
97+
98+
$this
99+
->session(['login.id' => $user->id(), 'login.remember' => true])
100+
->post(route('statamic.two-factor-challenge'), [
101+
'code' => $this->getOneTimeCode($user),
102+
'_redirect' => '/dashboard',
103+
])
104+
->assertRedirect('/dashboard')
105+
->assertSessionMissing('login.id')
106+
->assertSessionMissing('login.remember');
107+
}
108+
93109
#[Test]
94110
public function it_completes_challenge_with_recovery_code_and_redirects()
95111
{

0 commit comments

Comments
 (0)