Skip to content

Commit 03ed212

Browse files
committed
Redirect to intended URL after email verification (#119)
This allows users to redirect to the intended URL instead of the home page, after they have verified their email address, as described in laravel/framework#34808
1 parent c4e4b38 commit 03ed212

6 files changed

+54
-6
lines changed

Diff for: src/Http/Controllers/EmailVerificationNotificationController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public function store(Request $request)
1919
if ($request->user()->hasVerifiedEmail()) {
2020
return $request->wantsJson()
2121
? new JsonResponse('', 204)
22-
: redirect(config('fortify.home'));
22+
: redirect()->intended(config('fortify.home'));
2323
}
2424

2525
$request->user()->sendEmailVerificationNotification();

Diff for: src/Http/Controllers/EmailVerificationPromptController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class EmailVerificationPromptController extends Controller
1717
public function __invoke(Request $request)
1818
{
1919
return $request->user()->hasVerifiedEmail()
20-
? redirect(config('fortify.home'))
20+
? redirect()->intended(config('fortify.home'))
2121
: app(VerifyEmailViewResponse::class);
2222
}
2323
}

Diff for: src/Http/Controllers/VerifyEmailController.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ class VerifyEmailController extends Controller
1818
public function __invoke(VerifyEmailRequest $request): RedirectResponse
1919
{
2020
if ($request->user()->hasVerifiedEmail()) {
21-
return redirect(config('fortify.home').'?verified=1');
21+
return redirect()->intended(config('fortify.home').'?verified=1');
2222
}
2323

2424
if ($request->user()->markEmailAsVerified()) {
2525
event(new Verified($request->user()));
2626
}
2727

28-
return redirect(config('fortify.home').'?verified=1');
28+
return redirect()->intended(config('fortify.home').'?verified=1');
2929
}
3030
}

Diff for: tests/EmailVerificationNotificationControllerTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,20 @@ public function test_user_is_redirect_if_already_verified()
3636

3737
$response->assertRedirect('/home');
3838
}
39+
40+
public function test_user_is_redirect_to_intended_url_if_already_verified()
41+
{
42+
$user = Mockery::mock(Authenticatable::class);
43+
44+
$user->shouldReceive('hasVerifiedEmail')->andReturn(true);
45+
$user->shouldReceive('getAuthIdentifier')->andReturn(1);
46+
$user->shouldReceive('sendEmailVerificationNotification')->never();
47+
48+
$response = $this->from('/email/verify')
49+
->actingAs($user)
50+
->withSession(['url.intended' => 'http://foo.com/bar'])
51+
->post('/email/verification-notification');
52+
53+
$response->assertRedirect('http://foo.com/bar');
54+
}
3955
}

Diff for: tests/EmailVerificationPromptControllerTest.php

+30
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,34 @@ public function test_the_email_verification_prompt_view_is_returned()
2222
$response->assertStatus(200);
2323
$response->assertSeeText('hello world');
2424
}
25+
26+
public function test_user_is_redirect_home_if_already_verified()
27+
{
28+
$this->mock(VerifyEmailViewResponse::class)
29+
->shouldReceive('toResponse')
30+
->andReturn(response('hello world'));
31+
32+
$user = Mockery::mock(Authenticatable::class);
33+
$user->shouldReceive('hasVerifiedEmail')->andReturn(true);
34+
35+
$response = $this->actingAs($user)->get('/email/verify');
36+
37+
$response->assertRedirect('/home');
38+
}
39+
40+
public function test_user_is_redirect_to_intended_url_if_already_verified()
41+
{
42+
$this->mock(VerifyEmailViewResponse::class)
43+
->shouldReceive('toResponse')
44+
->andReturn(response('hello world'));
45+
46+
$user = Mockery::mock(Authenticatable::class);
47+
$user->shouldReceive('hasVerifiedEmail')->andReturn(true);
48+
49+
$response = $this->actingAs($user)
50+
->withSession(['url.intended' => 'http://foo.com/bar'])
51+
->get('/email/verify');
52+
53+
$response->assertRedirect('http://foo.com/bar');
54+
}
2555
}

Diff for: tests/VerifyEmailControllerTest.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ public function test_the_email_can_be_verified()
2626
$user->shouldReceive('hasVerifiedEmail')->andReturn(false);
2727
$user->shouldReceive('markEmailAsVerified')->once();
2828

29-
$response = $this->actingAs($user)->get($url);
29+
$response = $this->actingAs($user)
30+
->withSession(['url.intended' => 'http://foo.com/bar'])
31+
->get($url);
3032

31-
$response->assertStatus(302);
33+
$response->assertRedirect('http://foo.com/bar');
3234
}
3335

3436
public function test_redirected_if_email_is_already_verified()

0 commit comments

Comments
 (0)