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.