LibreChat/api/server
J.C. Bartle a74546b60d 🛠️ fix: Recover OpenID refresh token drift
Prefer the browser refresh-token cookie when it differs from the
server-side OpenID session state, and force a real IdP refresh in that
case instead of reusing stale session tokens.

Store a short-lived refresh-token bridge when inline OBO refresh writes
a rotated browser cookie but session persistence fails, so follow-up
refreshes can still recover from the old token.

Keep the bridge grace TTL centralized in RefreshTokenBridge so both
recovery paths use the same env-backed value.

Note: drift is measured against the last-synced browserRefreshToken
marker, so the SSE path (intentionally stale cookie, authoritative
session) does not false-positive. Sessions predating the marker have no
browserRefreshToken; for those, drift falls back to comparing the cookie
against the session refresh token and prefers the cookie on difference.
This is the same self-healing pre-change-session window as the identity
binding fix and re-syncs within one session lifetime.

Tests cover cookie/session drift selection, reusable-session bypass on
drift, bridge storage after session-save failure, and the shared bridge
constant wiring.
2026-06-28 18:25:40 -04:00
..
controllers 🛠️ fix: Recover OpenID refresh token drift 2026-06-28 18:25:40 -04:00
middleware
routes
services 🛠️ fix: Recover OpenID refresh token drift 2026-06-28 18:25:40 -04:00
utils
cleanup.js
experimental.js
index.js
index.metrics.spec.js
index.spec.js
socialLogins.js
socialLogins.spec.js
telemetry.js
telemetry.spec.js