Throttle platform SSO session checks to cut per-request auth latency.
Deploy Ladill POS / deploy (push) Successful in 33s

Verify auth.ladill.com at most once every 90s; recommend Redis for session/cache in .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-30 16:49:38 +00:00
co-authored by Cursor
parent 2d8714de7f
commit e1053746ac
3 changed files with 42 additions and 1 deletions
+6 -1
View File
@@ -17,13 +17,18 @@ DB_DATABASE=ladill_pos
DB_USERNAME=ladill_pos DB_USERNAME=ladill_pos
DB_PASSWORD= DB_PASSWORD=
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
PLATFORM_DB_HOST=127.0.0.1 PLATFORM_DB_HOST=127.0.0.1
PLATFORM_DB_PORT=3306 PLATFORM_DB_PORT=3306
PLATFORM_DB_DATABASE=ladilldb PLATFORM_DB_DATABASE=ladilldb
PLATFORM_DB_USERNAME=ladill_pos PLATFORM_DB_USERNAME=ladill_pos
PLATFORM_DB_PASSWORD= PLATFORM_DB_PASSWORD=
SESSION_DRIVER=database SESSION_DRIVER=redis
# Idle web session length in minutes (1440 = 24 hours of inactivity). # Idle web session length in minutes (1440 = 24 hours of inactivity).
SESSION_LIFETIME=1440 SESSION_LIFETIME=1440
SESSION_DOMAIN=.ladill.com SESSION_DOMAIN=.ladill.com
@@ -11,9 +11,14 @@ use Symfony\Component\HttpFoundation\Response;
/** /**
* App sessions are subordinate to the platform (auth.ladill.com) session. * App sessions are subordinate to the platform (auth.ladill.com) session.
* When the platform session ends, clear this app's local session too. * When the platform session ends, clear this app's local session too.
*
* Re-checks auth.ladill.com at most once per TTL not on every request.
* Client-side sso-keepalive still pings periodically between checks.
*/ */
class EnsurePlatformSession class EnsurePlatformSession
{ {
private const VERIFY_TTL_SECONDS = 90;
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
if (! Auth::check()) { if (! Auth::check()) {
@@ -25,6 +30,11 @@ class EnsurePlatformSession
return $next($request); return $next($request);
} }
$verifiedAt = (int) $request->session()->get('platform_session_verified_at', 0);
if ($verifiedAt > 0 && (time() - $verifiedAt) < self::VERIFY_TTL_SECONDS) {
return $next($request);
}
$cookieHeader = (string) $request->headers->get('Cookie', ''); $cookieHeader = (string) $request->headers->get('Cookie', '');
if ($cookieHeader === '') { if ($cookieHeader === '') {
return $this->clearAppSession($request); return $this->clearAppSession($request);
@@ -33,6 +43,7 @@ class EnsurePlatformSession
try { try {
$response = Http::withHeaders(['Cookie' => $cookieHeader]) $response = Http::withHeaders(['Cookie' => $cookieHeader])
->timeout(3) ->timeout(3)
->connectTimeout(2)
->get('https://'.$authDomain.'/sso/ping'); ->get('https://'.$authDomain.'/sso/ping');
} catch (\Throwable) { } catch (\Throwable) {
return $next($request); return $next($request);
@@ -42,6 +53,10 @@ class EnsurePlatformSession
return $this->clearAppSession($request); return $this->clearAppSession($request);
} }
if ($response->successful()) {
$request->session()->put('platform_session_verified_at', time());
}
return $next($request); return $next($request);
} }
@@ -0,0 +1,21 @@
@if (auth()->check())
@php
$authPing = 'https://'.config('app.auth_domain').'/sso/ping';
$platformSignedOutUrl = route('sso.platform-signed-out', ['redirect' => url()->current()]);
@endphp
<script>
(function () {
const pingUrl = @js($authPing);
const signedOutUrl = @js($platformSignedOutUrl);
const ping = () => fetch(pingUrl, { credentials: 'include' })
.then((response) => {
if (response.status === 401) {
window.location.href = signedOutUrl;
}
})
.catch(() => {});
ping();
setInterval(ping, 5 * 60 * 1000);
})();
</script>
@endif