Quick answer: Listen for Photon’s Disconnected event. Detect token-expired reason. Fetch a fresh token from your auth endpoint, set on the Photon plugin, reconnect.

A co-op puzzle game using Photon Cloud has long matches. Players disconnect after ~45 minutes. Photon returns “token expired”. Sessions break mid-puzzle.

Detect Disconnect Reason

On Photon Disconnected:
    System.Compare(Photon.LastReason, "TokenExpired")
        → RefreshAndReconnect

Check the reason. Auto-reconnect only for expected expirations; for “server unavailable” etc., show user a different message.

Refresh Auth Token

AJAX → Request POST "https://yourapi/auth/refresh"
On AJAX Completed:
    Photon → Set Auth Token AJAX.LastData
    Photon → Connect

Fetch new token from your auth endpoint, set on Photon, reconnect. Resume previous room if you stored room ID.

Pre-Expiry Refresh

Optional: refresh before expiry. Photon tokens typically last 30 min; refresh at 25 min:

Every 1500 seconds:   // 25 min
    Photon connected? → RefreshToken

Avoids disconnect entirely. Cost: extra HTTP request per 25 min, negligible.

Server-Side Auth

If Photon uses your custom auth server (vs Photon Cloud default), the server endpoint must mint tokens validly. Check server uptime; expired token can also mean server returned a stale cached value.

Rejoin Room

Photon → Connect
On Connected:
    Photon → Rejoin Room (last_room_id)

Photon supports rejoin if the room still exists and your previous slot is held. Players resume mid-puzzle without re-matching.

Verifying

Force token expiry (set short TTL for test). Game auto-reconnects cleanly; UI shows brief “Reconnecting...” toast. Puzzle state preserved.

“Tokens expire. Catch, refresh, rejoin — one event handler keeps long sessions alive.”

For competitive games where mid-match disconnects matter, also implement game-state-resync on rejoin — player should pick up exactly where they left off.