microg / microg/GmsCore

[Games] games_lite token never persisted — infinite sign-in loop (com.poncle.vampiresurvivors)

Open
#3,710 0 comments 0 reactions 0 assignees View on GitHub
bug
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.