Dopo aver recuperato le credenziali di un utente o recuperato i suggerimenti per l'accesso, puoi verificare se è disponibile un token ID per la credenziale. Un token ID è un'asserzione firmata dell'identità di un utente che contiene anche le informazioni di base del profilo dell'utente, possibilmente incluso un indirizzo email verificato da Google. Quando i token ID sono disponibili, puoi utilizzarli per autenticarti in modo sicuro con il backend della tua app o per saltare il passaggio di verifica dell'email quando crei un nuovo account.
Un token ID è disponibile quando l'ID utente di un oggetto Credential
corrisponde all'ID utente di un Account Google a cui è stato eseguito l'accesso sul dispositivo.
Per accedere con un token ID, recuperalo prima con il metodo getIdTokens
. Poi, invia il token ID al backend della tua app. Sul backend, verifica
il token utilizzando una libreria client dell'API di Google o una libreria JWT
di uso generale.
Prima di iniziare
- La tua app deve essere in grado di recuperare le credenziali di un utente o recuperare un suggerimento per l'accesso.
- Devi chiamare
setAccountTypes(IdentityProviders.GOOGLE)
quando crei gli oggettiCredentialRequest
eHintRequest
.
Ottenere un token ID dall'oggetto Credentials
Dopo aver recuperato le credenziali di un utente, controlla se l'oggetto Credentials
include un token ID. In caso affermativo, chiama il numero 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 attestazioni aud
, iss
e exp
del token.
L'attestazione 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 tuo 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, utilizzando la libreria di autenticazione 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 sull'accesso con Google.