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

Po pobraniu danych logowania użytkownika lub pobraniu wskazówek dotyczących logowania możesz sprawdzić, czy dla danych logowania dostępny jest token identyfikatora. Token identyfikatora to podpisane potwierdzenie tożsamości użytkownika, które zawiera też podstawowe informacje o profilu użytkownika, w tym adres e-mail zweryfikowany przez Google. Gdy tokeny identyfikacyjne są dostępne, możesz ich używać do bezpiecznego uwierzytelniania w backendzie aplikacji lub do pomijania etapu weryfikacji adresu e-mail podczas tworzenia nowego konta.

Token identyfikatora jest dostępny, gdy identyfikator użytkownika obiektu Credential jest zgodny z identyfikatorem użytkownika konta Google, na którym użytkownik jest zalogowany na urządzeniu.

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

Zanim zaczniesz

Pobieranie tokena identyfikatora z obiektu Credentials

Po pobraniu danych logowania użytkownika sprawdź, czy obiekt Credentials zawiera token identyfikatora. Jeśli tak, wywołaj funkcję getIdTokens, aby go pobrać, i wyślij go do backendu za pomocą żądania 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);
    }
}

Weryfikowanie tokena tożsamości na backendzie

Po otrzymaniu tokena identyfikatora za pomocą HTTPS POST musisz zweryfikować podpis tokena oraz jego roszczenia aud, issexp.

Roszczenie aud w przypadku tokena tożsamości z usługi Smart Lock na hasła ma ten format:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Wartość SHA512HASH to skrót SHA-512 certyfikatu podpisywania. Tę wartość możesz uzyskać za pomocą narzędzi keytoolopenssl:

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

Możesz też uzyskać hash SHA-512, sprawdzając token identyfikatora, o którym wiesz, że jest prawidłowy.

Biblioteki JWT mogą wykonać niektóre z tych zadań weryfikacyjnych za Ciebie. Na przykład za pomocą Google Auth Library for 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 logowania przez Google.