Admins can enable or revoke store access per viewer; membership syncs to a configurable Google Group without changing app auth. Co-authored-by: Cursor <cursoragent@cursor.com>
6.1 KiB
Google Play Closed Testing — server-side setup
Deze functionaliteit beheert distributietoegang tot de Android-app via Google Play Closed Testing. Het vervangt niet de bestaande app-login of API-autorisatie.
Architectuur
Adminpaneel → backend → Google Cloud Identity Groups API → Google Group
↓
Google Play Closed Testing track
- Gebruikers worden niet individueel via de Play Developer API beheerd.
- De Closed Testing-track wordt eenmalig gekoppeld aan
PLAY_ACCESS_GROUP_EMAIL. - Het adminpaneel beheert alleen lidmaatschap van die groep.
Benodigde environment variables
Stel deze in op de master-api server (niet in de admin UI, niet in Git):
| Variabele | Verplicht | Beschrijving |
|---|---|---|
GOOGLE_CLOUD_PROJECT_ID |
Ja | Google Cloud project ID |
GOOGLE_SERVICE_ACCOUNT_EMAIL |
Ja | Service account e-mail |
GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY |
Ja | PEM private key ( \n als \n in env) |
PLAY_ACCESS_GROUP_ID |
Ja | Group resource ID (zonder groups/ prefix mag ook) |
PLAY_ACCESS_GROUP_EMAIL |
Ja | E-mailadres van de Google Group |
GOOGLE_WORKSPACE_ADMIN_EMAIL |
Meestal ja | Admin voor domain-wide delegation |
GOOGLE_WORKSPACE_CUSTOMER_ID |
Optioneel | Workspace customer ID |
GOOGLE_PLAY_OPT_IN_URL |
Aanbevolen | Publieke Closed Testing opt-in URL |
GOOGLE_PLAY_SYNC_INTERVAL_MS |
Optioneel | Reconciliatie-interval (default: 86400000 = 24u) |
Waar instellen
- Lokaal:
apps/master-api/.env - Productie/Dokploy: omgeving van de master-api container (
deploy/master/.envtemplate)
Google Cloud — handmatige stappen
1. APIs inschakelen
In Google Cloud Console → APIs & Services:
- Cloud Identity Groups API (
cloudidentity.googleapis.com)
2. Service account aanmaken
- IAM & Admin → Service Accounts → Create
- Download JSON key of kopieer private key naar
GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY - Noteer
client_email→GOOGLE_SERVICE_ACCOUNT_EMAIL
3. Domain-wide delegation (Workspace)
Als de group in Google Workspace staat:
- Service account → Enable Domain-Wide Delegation
- Google Admin Console → Security → API Controls → Domain-wide delegation
- Voeg scope toe:
https://www.googleapis.com/auth/cloud-identity.groups - Stel
GOOGLE_WORKSPACE_ADMIN_EMAILin op een super admin
4. Service account rechten op de group
De service account (of geïmpersonateerde admin) moet leden kunnen beheren:
- Google Group → Group member manager of Owner
- Of via Cloud Identity met de juiste IAM-rollen
5. Google Group aanmaken
Maak een technische ACL-groep (geen hardcoded naam in code):
- Niet publiek vindbaar
- Self-join uit
- Alleen beheerders beheren leden
- Ledenlijst niet zichtbaar voor gewone members
- Posten/conversations uit indien mogelijk
- Externe accounts alleen toestaan als nodig (bijv.
@gmail.comtesters)
Noteer:
- Group e-mail →
PLAY_ACCESS_GROUP_EMAIL - Group ID →
PLAY_ACCESS_GROUP_ID
Group ID vinden
Via Cloud Identity Groups API lookup:
GET https://cloudidentity.googleapis.com/v1/groups:lookup?groupKey.id=GROUP_EMAIL
Het veld name is bijv. groups/03abc123 → PLAY_ACCESS_GROUP_ID=03abc123
6. Google Play Console — Closed Testing koppelen
- Play Console → app → Testing → Closed testing
- Maak of open een track
- Testers → Google Groups
- Voeg
PLAY_ACCESS_GROUP_EMAILtoe - Kopieer de opt-in URL →
GOOGLE_PLAY_OPT_IN_URL
Gebruik in adminpaneel
- Ga naar Kijkers
- Per kijker: sectie Google Play access
- Google Play email — het Google-account voor Play (fallback: account-e-mail)
- Store access — ON/OFF
- Status — sync-status (ACTIVE, ERROR, …)
- Retry synchronization — bij ERROR
- Pagina-acties:
- Sync all — alle kijkers synchroniseren
- Reconcile — lokale status vergelijken met Google Group
Testgebruiker toevoegen
- Maak kijker aan (of bestaande)
- Vul Google Play e-mail in (bijv.
user@gmail.com) - Zet Store access aan
- Status wordt ACTIVE na succesvolle sync
- Gebruiker opent
GOOGLE_PLAY_OPT_IN_URLterwijl ingelogd met hetzelfde Google-account - Installeert app via Play Store
Toegang intrekken
- Zet Store access uit in adminpaneel
- Backend verwijdert lidmaatschap uit de group
- Nieuwe installs via Play zijn niet meer mogelijk
- Let op: reeds geïnstalleerde apps blijven op het toestel — app-login/API blijft leidend voor contenttoegang
Sync & reconciliatie
| Lokaal | Google Group | Actie |
|---|---|---|
| ON | member | OK |
| ON | geen member | toevoegen |
| OFF | member | verwijderen |
| OFF | geen member | OK |
- Sync all: past gewenste status toe voor alle kijkers
- Reconcile: vergelijkt en herstelt afwijkingen
- Scheduled: elke
GOOGLE_PLAY_SYNC_INTERVAL_MS(default 24u)
Foutafhandeling
Bij Google API-fouten:
- Gewenste instelling blijft bewaard
- Status → ERROR
- Fout staat in admin UI + audit log
- Gebruik Retry synchronization
Audit log tabel: google_play_access_audit_logs (geen tokens/keys gelogd).
API endpoints (admin only)
| Method | Route |
|---|---|
| GET | /api/v1/admin/google-play-access/config |
| PATCH | /api/v1/admin/viewers/:id/google-play-access |
| POST | /api/v1/admin/viewers/:id/google-play-access/retry |
| POST | /api/v1/admin/google-play-access/sync-all |
| POST | /api/v1/admin/google-play-access/reconcile |
Body PATCH:
{
"enabled": true,
"email": "user@gmail.com"
}
Wat jij nog handmatig moet invullen
Stop hier — vul geen credentials in deze repo:
GOOGLE_CLOUD_PROJECT_IDGOOGLE_SERVICE_ACCOUNT_EMAILGOOGLE_SERVICE_ACCOUNT_PRIVATE_KEYGOOGLE_WORKSPACE_ADMIN_EMAIL(indien Workspace)PLAY_ACCESS_GROUP_IDPLAY_ACCESS_GROUP_EMAILGOOGLE_PLAY_OPT_IN_URL
Daarna master-api herstarten en in adminpaneel testen met één tester-account.