Quando verifichi che l'utente ha acquistato o scaricato una copia legittima della tua app dal Google Play Store, è meglio eseguire il controllo di verifica delle licenze su un server controllato da te.
Questa guida illustra una procedura passo passo per completare la verifica della licenza lato server e illustra alcune best practice relative all'esecuzione di questo controllo.
Panoramica della procedura
La Figura 1 mostra la modalità di trasferimento delle informazioni tra la tua app, Google Play e il tuo server privato:
- La tua app invia una richiesta a Google Play per sapere se un determinato utente ha acquistato o scaricato una copia legittima della tua app.
- Google Play risponde inviando alla tua app un oggetto dati risposta, un oggetto di tipo
ResponseData
. Questo oggetto è un'informazione firmata che indica se l'utente ha acquistato o scaricato una copia legittima della tua app. - La tua app invia una richiesta a un server privato controllato da te, verificando i contenuti dei dati della risposta.
- Il server risponde inviando uno stato all'app, che indica se l'utente ha effettivamente acquistato o scaricato una copia legittima dell'app. Se il server restituisce un messaggio di operazione riuscita, verifica la risposta e concedi all'utente l'accesso alle risorse che richiedono una licenza.
Poiché i dati delle risposte vengono firmati da Google Play e poi controllati sul server, non è possibile modificare l'oggetto sul dispositivo che esegue l'app. Se la tua app si basa sul server e rende le risorse disponibili solo a utenti legittimi, la tua app è notevolmente più protetta da utenti non autorizzati.
Le sezioni seguenti forniscono ulteriori considerazioni da tenere presente quando si esegue la verifica delle licenze lato server.
Proteggiti dagli attacchi di replay
Dopo aver ricevuto una risposta da Google Play in merito allo stato della licenza dell'utente, l'utente può copiare i dati della risposta e utilizzarli più volte, oppure trasmetterli ad altri utenti che potrebbero falsificare le proprie richieste al server privato della tua app. Questo tipo di azione è noto come attacco replica.
Per ridurre le probabilità che gli utenti eseguano correttamente attacchi di ripetizione, adotta le seguenti misure prima di inviare una richiesta al server della tua app:
Controlla il timestamp incluso nei dati della risposta, assicurandoti che Google Play abbia generato la risposta di recente.
Esegui una limitazione della frequenza sulla richiesta del server, ad esempio il backoff esponenziale, per ridurre il numero di volte in cui l'app tenta di inviare gli stessi dati di risposta al server dell'app.
Prima di verificare i contenuti dei dati delle risposte di Google Play sul tuo server privato, effettua una richiesta iniziale basata sull'autenticazione al server privato. In questa prima richiesta, invia le credenziali utente al tuo server e fai quindi in modo che quest'ultimo risponda con un nonce o un numero che viene utilizzato una sola volta. Puoi quindi includere questo nonce nella successiva richiesta al tuo server privato, chiedendo i dati di verifica delle licenze. Per informazioni dettagliate su come scegliere un valore ottimale per il nodo, consulta la sezione Generare un valore nonce adatto.
Genera un valore nonce adatto
Utilizza una delle seguenti tecniche per creare un valore nonce difficile da prevedere:
- Genera un valore hash basato sull'ID dell'utente.
- Generare un valore casuale per singolo utente. Memorizza questo valore casuale sul server dell'app come parte degli attributi di un determinato utente.
Verifica i dati della risposta dal tuo server
Quando esamini i dati di risposta che il server dell'app invia alla tua app, assicurati che la risposta della Libreria di verifica delle licenze non sia falsa. Verifica la firma inclusa nei dati di risposta dell'app server confrontandola con la chiave che la tua app ha ricevuto da Google Play in un passaggio precedente.
Inoltre, è bene ricordare che il blocco specifico della LVL (License Verification Library) è l'unica parte firmata. È quindi l'unica parte dei dati di risposta del tuo server app che l'app deve considerare attendibile.