Aggiunta della verifica delle licenze lato server all'app
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
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:
Figura 1. Flusso di dati tra la tua app e Google Play, quindi tra la tua app e il 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.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Adding Server-Side License Verification to Your App\n\nWhen verifying that the user has purchased or downloaded a legitimate copy of\nyour app from the Google Play Store, it's best to perform the license\nverification check on a server that you control.\n\nThis guide presents a step-by-step process for completing server-side license\nverification and presents some best practices related to performing this check.\n\nProcess overview\n----------------\n\nFigure 1 shows how information is transferred between your app, Google Play, and\nyour private server: \n**Figure 1.** Flow of data between your app and Google Play, then between your app and your private server\n\n1. Your app makes a request to Google Play, inquiring about whether a particular user has purchased or downloaded a legitimate copy of your app.\n2. Google Play responds by sending a *response data object* , an object of type [`ResponseData`](/google/play/licensing/licensing-reference#lvl-summary), to your app. This object is a signed piece of information that states whether the user has purchased or downloaded a legitimate copy of your app.\n3. Your app makes a request to a private server that you control, verifying the contents of the response data.\n4. The server responds by sending a status to your app, indicating whether the user has indeed purchased or downloaded a legitimate copy of your app. If the server provides a \"success\" message, [verify the\n response](#verify-app-server-response) and then grant the user access to the resources that require a license.\n\nBecause the response data is signed by Google Play, then checked on your\nserver, there's no way to modify the object on the device running your app. If\nyour app relies on the server and makes resources available only to legitimate\nusers, your app is substantially more protected against unauthorized users.\n\nThe following sections provide additional considerations to keep in mind when\nperforming server-side license verification.\n\nSafeguard against replay attacks\n--------------------------------\n\nAfter receiving a response from Google Play regarding the user's license status,\nit's possible for the user to copy the response data and use it multiple times,\nor give it to other users who could then forge their own requests to your app's\nprivate server. This sort of action is known as a *replay attack*.\n\nTo reduce the likelihood of users performing replay attacks successfully, take\nthe following measures before sending a request to your app's server:\n\n- Check the timestamp that's included in the response data, making sure that\n Google Play generated the response recently.\n\n | **Note:** You can increase the allowed difference between the response data's timestamp and the current time based on how long users should be able to interact with license-bound resources after they deactivate their license.\n- Perform rate-limiting on your server request, such as exponential backoff, to\n reduce the number of times that your app attempts to send the same response data\n to your app's server.\n\n | **Caution:** To preserve a good user experience in cases where a user interacts with your app on a variety of devices, be careful if you add rate-limiting based on number of devices.\n- Before verifying the contents of Google Play's response data on your private\n server, make an initial, authentication-based request to your private server. In\n this first request, send user credentials to your server, and have your server\n then respond with a *nonce* , or a number that is used only once. You can then\n include this nonce in your next request to your private server, asking for\n license verification data. For details on how to choose a good value for the\n nonce, see the [generate a suitable nonce value](#generate-nonce) section.\n\n | **Note:** Include a user ID field in both the nonce request and the license verification request. Your app's server can then compare the fields' values from the two requests and make sure they match.\n\n### Generate a suitable nonce value\n\nUse one of the following techniques to create a nonce value that's difficult to\nguess:\n\n- Generate a hash value based on the user's ID.\n- Generate a random value on a per-user basis. Store this random value on your app's server as part of a given user's attributes.\n\nVerify response data from your server\n-------------------------------------\n\nWhen reviewing response data that your app's server sends to your app, make sure\nthat the License Verification Library response isn't forged. Verify the\nsignature that's included in the app server's response data by comparing it\nwith the key that your app received from Google Play in a previous step.\n\nIt's also worth remembering that the block specific to the License Verification\nLibrary (LVL) is the only part that's signed. Therefore, it's the only part of\nyour app server's response data that your app should trust."]]