Mit ID-Tokens anmelden

Nachdem Sie die Anmeldedaten eines Nutzers abgerufen oder Anmeldehinweise abgerufen haben, können Sie prüfen, ob ein ID-Token für die Anmeldedaten verfügbar ist. Ein ID-Token ist eine signierte Assertion der Identität eines Nutzers, die auch grundlegende Profilinformationen des Nutzers enthält, möglicherweise einschließlich einer von Google bestätigten E-Mail-Adresse. Wenn ID-Tokens verfügbar sind, können Sie sie verwenden, um sich sicher beim Backend Ihrer App zu authentifizieren oder den Schritt der E‑Mail-Bestätigung beim Erstellen eines neuen Kontos zu überspringen.

Ein ID-Token ist verfügbar, wenn die Nutzer-ID eines Credential-Objekts mit der Nutzer-ID eines Google-Kontos übereinstimmt, das auf dem Gerät angemeldet ist.

Wenn Sie sich mit einem ID-Token anmelden möchten, rufen Sie das ID-Token zuerst mit der Methode getIdTokens ab. Senden Sie das ID-Token dann an das Backend Ihrer App. Überprüfen Sie das Token im Backend entweder mit einer Google API-Clientbibliothek oder einer universellen JWT-Bibliothek.

Hinweis

ID-Token aus dem Anmeldedatenobjekt abrufen

Nachdem Sie die Anmeldedaten eines Nutzers abgerufen haben, prüfen Sie, ob das Credentials-Objekt ein ID-Token enthält. Wenn dies der Fall ist, rufen Sie sie mit getIdTokens ab und senden Sie sie per HTTPS POST an Ihr Backend.

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);
    }
}

ID-Token im Backend überprüfen

Nachdem Sie das ID-Token per HTTPS POST erhalten haben, müssen Sie die Signatur des Tokens sowie die aud-, iss- und exp-Claims des Tokens überprüfen.

Die Anforderung aud eines ID-Tokens von Smart Lock für Passwörter hat das folgende Format:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Der Wert SHA512HASH ist der SHA-512-Hash Ihres Signaturzertifikats. Sie können diesen Wert mit den Dienstprogrammen keytool und openssl abrufen:

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

Alternativ können Sie den SHA‑512-Hash abrufen, indem Sie ein ID‑Token untersuchen, das Ihrer Meinung nach gültig ist.

JWT-Bibliotheken können einige dieser Überprüfungsaufgaben für Sie übernehmen. Beispiel für die Verwendung der Google-Authentifizierungsbibliothek für 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.");
}

Weitere Informationen finden Sie in der Google-Anmeldung-Dokumentation.