Accedi utilizzando i token ID

Dopo aver recuperato le credenziali di un utente o recuperato i suggerimenti di accesso, puoi verificare se è disponibile un token ID per la credenziale. Un token ID è un'asserzione firmata dell'identità di un utente contenente anche le informazioni di base del profilo dell'utente, che potrebbe includere un indirizzo email verificato da Google. Quando sono disponibili i token ID, puoi utilizzarli per eseguire l'autenticazione in sicurezza con il backend dell'app o saltare il passaggio della verifica email quando crei un nuovo account.

Un token ID è disponibile quando lo User-ID di un oggetto Credential corrisponde allo User ID di un Account Google a cui è stato eseguito l'accesso sul dispositivo.

Per accedere con un token ID, recupera prima il token ID con il metodo getIdTokens. Quindi, invia il token ID al backend dell'app. Nel backend, verifica il token utilizzando una libreria client dell'API di Google o una libreria JWT per uso generico.

Prima di iniziare

Recuperare un token ID dall'oggetto Credenziali

Dopo aver recuperato le credenziali di un utente, controlla se l'oggetto Credentials include un token ID. In caso affermativo, chiama getIdTokens per recuperarlo e invialo al tuo backend tramite POST HTTPS.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

Verificare il token ID sul backend

Dopo aver ricevuto il token ID tramite HTTPS POST, devi verificare la firma del token e le rivendicazioni aud, iss e exp del token.

La rivendicazione aud di un token ID di Smart Lock per password ha il seguente formato:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Il valore SHA512HASH è l'hash SHA-512 del certificato di firma. Puoi ottenere questo valore utilizzando le utilità keytool e openssl:

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

In alternativa, puoi ottenere l'hash SHA-512 esaminando un token ID che sai essere valido.

Le librerie JWT possono gestire alcune di queste attività di verifica per te. Ad esempio, l'utilizzo della libreria client delle API di Google per Java:

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

Per ulteriori dettagli, consulta la documentazione di Accedi con Google.