Logowanie się przy użyciu tokenów tożsamości

Po odzyskaniu danych logowania użytkownika lub uzyskaniu wskazówek dotyczących logowania możesz sprawdzić, czy dla tych danych jest dostępny token tożsamości. Token tożsamości to podpisane potwierdzenie tożsamości użytkownika, które zawiera również podstawowe informacje o jego profilu, prawdopodobnie wraz z adresem e-mail zweryfikowanym przez Google. Gdy tokeny tożsamości są dostępne, możesz ich używać do bezpiecznego uwierzytelniania w backendzie aplikacji lub do pominięcia etapu potwierdzania adresu e-mail podczas tworzenia nowego konta.

Token tożsamości jest dostępny, gdy identyfikator użytkownika obiektu Credential pasuje do identyfikatora użytkownika konta Google zalogowanego na urządzeniu.

Aby zalogować się za pomocą tokena tożsamości, najpierw pobierz ten token za pomocą metody getIdTokens. Następnie wyślij token identyfikatora do backendu aplikacji. W backendzie zweryfikuj token za pomocą biblioteki klienta interfejsu API Google lub ogólnej biblioteki JWT.

Zanim zaczniesz

Uzyskiwanie tokena identyfikatora z obiektu Credentials

Po pobraniu danych logowania użytkownika sprawdź, czy obiekt Credentials zawiera token identyfikatora. Jeśli tak, wywołaj getIdTokens, aby go pobrać i wyślij go do backendu za pomocą metody HTTPS POST.

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

Zweryfikuj token identyfikatora w backendzie

Po otrzymaniu tokena identyfikatora za pomocą HTTPS POST musisz zweryfikować podpis tokena i zweryfikować żądania aud, iss i exp tokena.

Żądanie aud tokena tożsamości z funkcji Smart Lock na hasła ma taki format:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Wartość SHA512HASH to identyfikator SHA-512 certyfikatu podpisującego. Tę wartość możesz uzyskać za pomocą narzędzi keytool i openssl:

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

Możesz też uzyskać skrót SHA-512, sprawdzając token tożsamości, o którym wiesz, że jest prawidłowy.

Biblioteki JWT mogą wykonać niektóre z tych zadań weryfikacyjnych. Oto przykład użycia biblioteki klienta interfejsów API Google dla języka 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.");
}

Więcej informacji znajdziesz w dokumentacji dotyczącej logowania przez Google.