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

Po pobraniu danych logowania użytkownika lub pobrane wskazówki logowania, możesz sprawdzić, czy dla danych logowania jest dostępny token tożsamości. Token tożsamości to podpisane potwierdzenie tożsamości użytkownika, które zawiera też podstawowy profil użytkownika takich jak adres e-mail zweryfikowany przez Google. Jeśli tokeny tożsamości są dostępne, możesz ich używać do bezpiecznego uwierzytelnij się w backendzie aplikacji lub pomiń krok weryfikacji adresu e-mail. podczas tworzenia nowego konta.

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

Aby zalogować się przy użyciu tokena identyfikatora, najpierw pobierz go za pomocą interfejsu getIdTokens . Następnie wyślij token identyfikatora do backendu aplikacji. W backendzie sprawdź, token za pomocą biblioteki klienta interfejsu API Google lub tokena JWT ogólnego przeznaczenia. bibliotece.

Zanim zaczniesz

Uzyskiwanie tokena identyfikatora z obiektu danych logowania

Po pobraniu danych logowania użytkownika sprawdź, czy obiekt Credentials zawiera token tożsamości. Jeśli tak, wywołaj getIdTokens, aby ją odzyskać i wysłać 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);
    }
}

Sprawdzanie tokena identyfikatora w backendzie

Po otrzymaniu tokena tożsamości za pomocą metody HTTPS POST musisz zweryfikować poprawność podpis i zweryfikuj deklaracje aud, iss i exp tokena.

Żądanie tokena aud dotyczące tokena tożsamości z usługi Smart Lock na hasła składa się z tych elementów: format:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Wartość SHA512HASH to identyfikator SHA-512 Twojego podpisu. certyfikat. Tę wartość możesz sprawdzić 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ć hasz SHA-512, sprawdzając token tożsamości, o którym wiesz, że jest prawidłowy.

Biblioteki JWT mogą obsługiwać niektóre z tych zadań weryfikacji. Przykład: korzystając z 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.");
}

Zapoznaj się z dokumentacją Logowania przez Google. .