[Games] games_lite token never persisted — infinite sign-in loop (com.poncle.vampiresurvivors)
- Dominant language
- Java
- Stars
- 14.6k
- Forks
- 3.2k
- PR merge metrics
- PR metrics pending
Description
**Describe the bug**
The Play Games sign-in consent screen loops indefinitely when launching
Vampire Survivors (com.poncle.vampiresurvivors): ~40 iterations in 39 seconds.
Each iteration, Google successfully returns a fresh valid access token for the
games_lite scope, but the next iteration immediately reports it as expired.
The token is apparently never persisted to the auth cache.
The consent dialog also renders with an empty body — only the app icon and the
"Allow and share" button are visible.
In-app billing fails in the same session, possibly for the same reason: the
billing activity displays, runs DroidGuard (phonesky_acquire_flow), then closes
after 1.1s with no error logged, and the app receives BillingResponseCode = Ok
with a failed purchase.
**To Reproduce**
Steps to reproduce the behavior:
1. Sign in with a Google account via App Lounge, using "system-wide" sign-in
2. Launch Vampire Survivors
3. The Play Games consent screen appears, closes and reopens indefinitely
4. Dismiss it by tapping outside, then attempt to purchase a DLC in-game
5. See the purchase fail with no error dialog
**Expected behavior**
The granted token is cached and reused, so sign-in completes once and the
consent screen does not reappear. In-app purchases complete normally.
**Screenshots**
Consent dialog rendered empty (icon + button only) — attached.
**System**
Android Version: 15
Custom ROM: /e/OS 4.0-a15-20260610633983-official-FP6
Device: Fairphone 6
microG (google_play_services_version): 250932000
**Additional context**
Each of the 40 cycles is identical:
D/GamesConnectService: autoSelectLogin: account:
D/GmsAuthManager: token present, but expired
D/GmsHttpFormClient: -- Response --
D/GmsHttpFormClient: grantedScopes=https://www.googleapis.com/auth/games_lite
D/GmsHttpFormClient: ExpiresInDurationSec=3599
D/GmsHttpFormClient: Expiry=1786552044
D/GmsHttpFormClient: issueAdvice=auto
D/GmsHttpFormClient: isTokenSnowballed=1
D/AuthSignInActivity: Result: Bundle[{authorization_result=[...]}]
D/GamesSignIn: Sign in as
D/GmsAuthManager: peekAuthToken: com.poncle.vampiresurvivors:...:oauth2:.../games_lite
Expiry values are correct — device clock is UTC+2, and each Expiry equals
current time + 3600s. Google returns HTTP success with a distinct valid token
every time. No error, exception or failure code anywhere in the log.
Billing failure in the same session:
I/ActivityTaskManager: START com.android.vending/org.microg.vending.billing.ui.InAppBillingHostActivity
I/ActivityTaskManager: Displayed .../InAppBillingHostActivity for user 0: +93ms
D/GmsGuardHandleImpl: initWithRequest(phonesky_acquire_flow, DroidGuardResultsRequest[...])
(activity closes 1.1s later, no error logged)
D/Billing: getPurchasesExtraParams(apiVersion=19, packageName=com.poncle.vampiresurvivors, type=inapp, ...)
D/Billing: Result: Bundle[{INAPP_PURCHASE_ITEM_LIST=[], DEBUG_MESSAGE=, RESPONSE_CODE=0, ...}]
W/Unity: onPurchaseFailedEvent(productId:dlc_moonspell message: {M: GPUL.HEC} - Google BillingResponseCode = Ok)
E/Unity: [PurchasingController] Purchase Failed for product ID dlc_moonspell: Unknown
Product: dlc_moonspell — Play Billing Library 7.1.1 — billing apiVersion 19
Configuration checked:
- Self-Check: all items ticked
- Device registration: enabled and registered, profile "Automatic: Native"
- "Answer license verification requests" and "Handle billing requests": enabled
- "Allow apps to access the account": enabled
- Advanced Privacy (tracker blocking, IP hiding, fake location): all disabled
- Account removed, revoked server-side, and re-added system-wide: no change
Full sanitized logcat attached (tokens, account name and device identifiers removed).
[log_clean.txt](https://github.com/user-attachments/files/30988361/log_clean.txt)
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the GamesConnectService, GmsAuthManager, AuthSignInActivity, and InAppBillingHostActivity flows described in the logcat, then reproduce the system-wide sign-in and billing steps. Trace why the games_lite token is treated as expired after a successful response and why the billing activity closes; done means sign-in completes without looping and the reported purchase flow no longer fails silently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java
- Domain
- authentication, mobile, payments
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100