Fix SSO popup callback infinite loop and post-login 500.
Deploy Ladill Give / deploy (push) Successful in 43s

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-09 20:21:16 +00:00
co-authored by Cursor
parent 34254e79e0
commit ea1eba1523
2 changed files with 10 additions and 15 deletions
@@ -83,6 +83,8 @@ class SsoLoginController extends Controller
{ {
$intended = (string) $request->session()->get('sso.intended', route('give.dashboard')); $intended = (string) $request->session()->get('sso.intended', route('give.dashboard'));
$popup = (bool) $request->session()->get('sso.popup');
if ($request->filled('error')) { if ($request->filled('error')) {
if (in_array($request->query('error'), ['login_required', 'interaction_required', 'consent_required'], true) if (in_array($request->query('error'), ['login_required', 'interaction_required', 'consent_required'], true)
&& ! $request->boolean('interactive')) { && ! $request->boolean('interactive')) {
@@ -92,12 +94,12 @@ class SsoLoginController extends Controller
]); ]);
} }
return $this->finishCallback($request, $intended, (string) $request->query('error_description', $request->query('error'))); return $this->finishCallback($request, $intended, (string) $request->query('error_description', $request->query('error')), $popup);
} }
if (! $request->filled('code') if (! $request->filled('code')
|| $request->query('state') !== $request->session()->pull('sso.state')) { || $request->query('state') !== $request->session()->pull('sso.state')) {
return $this->finishCallback($request, $intended, 'invalid_state'); return $this->finishCallback($request, $intended, 'invalid_state', $popup);
} }
$issuer = rtrim((string) config('services.ladill_sso.issuer'), '/'); $issuer = rtrim((string) config('services.ladill_sso.issuer'), '/');
@@ -111,12 +113,12 @@ class SsoLoginController extends Controller
'code_verifier' => (string) $request->session()->pull('sso.verifier'), 'code_verifier' => (string) $request->session()->pull('sso.verifier'),
]); ]);
if ($tokenRes->failed()) { if ($tokenRes->failed()) {
return $this->finishCallback($request, $intended, 'token_exchange_failed'); return $this->finishCallback($request, $intended, 'token_exchange_failed', $popup);
} }
$user = $this->loginFromTokenResponse($request, $tokenRes); $user = $this->loginFromTokenResponse($request, $tokenRes);
if (! $user) { if (! $user) {
return $this->finishCallback($request, $intended, 'userinfo_failed'); return $this->finishCallback($request, $intended, 'userinfo_failed', $popup);
} }
QrTeamMember::linkPendingInvitesFor($user); QrTeamMember::linkPendingInvitesFor($user);
@@ -124,7 +126,7 @@ class SsoLoginController extends Controller
Auth::login($user, remember: true); Auth::login($user, remember: true);
$request->session()->regenerate(); $request->session()->regenerate();
return $this->finishCallback($request, $intended); return $this->finishCallback($request, $intended, null, $popup);
} }
public function logout(Request $request): RedirectResponse public function logout(Request $request): RedirectResponse
@@ -248,9 +250,9 @@ class SsoLoginController extends Controller
return strtolower((string) $user->email) !== $mailbox; return strtolower((string) $user->email) !== $mailbox;
} }
private function finishCallback(Request $request, string $intended, ?string $error = null): RedirectResponse|View private function finishCallback(Request $request, string $intended, ?string $error = null, bool $popup = false): RedirectResponse|View
{ {
if ($request->session()->pull('sso.popup')) { if ($popup) {
return view('auth.sso-popup-done', [ return view('auth.sso-popup-done', [
'intended' => $intended, 'intended' => $intended,
'error' => $error, 'error' => $error,
@@ -6,18 +6,11 @@
<meta name="robots" content="noindex"> <meta name="robots" content="noindex">
</head> </head>
<body> <body>
@php
$ssoFallbackUrl = $fallbackUrl ?? route('sso.connect', [
'redirect' => $intended,
'interactive' => 1,
'fallback' => 1,
]);
@endphp
<script> <script>
(function () { (function () {
var intended = @json($intended); var intended = @json($intended);
var appOrigin = @json($appOrigin); var appOrigin = @json($appOrigin);
var fallbackUrl = @json($ssoFallbackUrl); var fallbackUrl = @json($fallbackUrl);
@if ($error) @if ($error)
if (window.opener) { if (window.opener) {
window.opener.postMessage({ type: 'ladill:sso:error' }, appOrigin); window.opener.postMessage({ type: 'ladill:sso:error' }, appOrigin);