Skip to content

Commit a1586b4

Browse files
[Feature/Fix] Redirect users back to previous URL upon sign in (#5)
* Redirect users back to previous URL upon sign in * formatting * helper * formatting --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 75094c4 commit a1586b4

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/Http/Requests/AuthKitAuthenticationRequest.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
use Illuminate\Auth\Events\Registered;
77
use Illuminate\Foundation\Http\FormRequest;
88
use Illuminate\Support\Facades\Auth;
9+
use Illuminate\Support\Facades\URL;
10+
use Inertia\Inertia;
911
use Laravel\WorkOS\User;
1012
use Laravel\WorkOS\WorkOS;
13+
use Symfony\Component\HttpFoundation\Response;
1114
use WorkOS\UserManagement;
1215

1316
class AuthKitAuthenticationRequest extends FormRequest
@@ -99,17 +102,41 @@ protected function updateUsing(AppUser $user, User $userFromWorkOS): AppUser
99102
]);
100103
}
101104

105+
/**
106+
* Redirect the user to the previous URL or a default URL if no previous URL is available.
107+
*/
108+
public function redirect(string $default = '/'): Response
109+
{
110+
$previousUrl = rtrim(base64_decode($this->sessionState()['previous_url'] ?? '/')) ?: null;
111+
112+
$to = ! is_null($previousUrl) && $previousUrl !== URL::to('/')
113+
? $previousUrl
114+
: $default;
115+
116+
return class_exists(Inertia::class)
117+
? Inertia::location($to)
118+
: redirect($to);
119+
}
120+
102121
/**
103122
* Ensure the request state is valid.
104123
*/
105124
protected function ensureStateIsValid(): void
106125
{
107126
$state = json_decode($this->query('state'), true)['state'] ?? false;
108127

109-
if ($state !== $this->session()->get('state')) {
128+
if ($state !== ($this->sessionState()['state'] ?? false)) {
110129
abort(403);
111130
}
112131

113132
$this->session()->forget('state');
114133
}
134+
135+
/**
136+
* Get the session state.
137+
*/
138+
protected function sessionState(): array
139+
{
140+
return json_decode($this->session()->get('state'), true) ?: [];
141+
}
115142
}

src/Http/Requests/AuthKitLoginRequest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Laravel\WorkOS\Http\Requests;
44

55
use Illuminate\Foundation\Http\FormRequest;
6+
use Illuminate\Support\Facades\URL;
67
use Illuminate\Support\Str;
78
use Inertia\Inertia;
89
use Laravel\WorkOS\WorkOS;
@@ -20,11 +21,14 @@ public function redirect(): Response
2021

2122
$url = (new UserManagement)->getAuthorizationUrl(
2223
config('services.workos.redirect_url'),
23-
['state' => $state = Str::random(20)],
24+
$state = [
25+
'state' => Str::random(20),
26+
'previous_url' => base64_encode(URL::previous()),
27+
],
2428
'authkit',
2529
);
2630

27-
$this->session()->put('state', $state);
31+
$this->session()->put('state', json_encode($state));
2832

2933
return class_exists(Inertia::class)
3034
? Inertia::location($url)

0 commit comments

Comments
 (0)