Kimlik jetonlarını kullanarak oturum açma

Kullanıcının kimlik bilgilerini başarıyla aldıktan veya oturum açma ipuçlarını aldıktan sonra kimlik bilgisi için kimlik jetonunun kullanılabilir olup olmadığını kontrol edebilirsiniz. Kimlik jetonu, kullanıcının kimliğinin imzalı bir onayının yanı sıra kullanıcının temel profil bilgilerini (Google tarafından doğrulanmış bir e-posta adresi de dahil olabilir) içerir. Kimlik jetonları kullanıma sunulduğunda, uygulamanızın arka ucuyla güvenli bir şekilde kimlik doğrulamak veya yeni hesap oluştururken e-posta doğrulama adımını atlamak için bu jetonları kullanabilirsiniz.

Bir Credential nesnesinin kullanıcı kimliği, cihazda oturum açılmış bir Google Hesabı'nın kullanıcı kimliğiyle eşleştiğinde kimlik jetonu kullanılabilir.

Kimlik jetonuyla oturum açmak için önce getIdTokens yöntemiyle kimlik jetonunu alın. Ardından, kimlik jetonunu uygulamanızın arka ucuna gönderin. Arka uçta, jetonu bir Google API istemci kitaplığı veya genel amaçlı bir JWT kitaplığı kullanarak doğrulayın.

Başlamadan önce

Kimlik bilgileri nesnesinden kimlik jetonu alma

Bir kullanıcının kimlik bilgilerini aldıktan sonra Credentials nesnesinin kimlik jetonu içerip içermediğini kontrol edin. Bu durumda, almak için getIdTokens numarasını arayın ve HTTPS POST ile arka ucunuza gönderin.

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

Arka uçta kimlik jetonunu doğrulama

HTTPS POST ile kimlik jetonunu aldıktan sonra jetonun imzasını ve jetonun aud, iss ve exp taleplerini doğrulamanız gerekir.

Şifreler için Smart Lock'tan alınan kimlik jetonunun aud talebi şu biçimdedir:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

SHA512HASH değeri, imzalama sertifikanızın SHA-512 karmasıdır. Bu değeri keytool ve openssl yardımcı programlarını kullanarak alabilirsiniz:

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

Alternatif olarak, geçerli olduğunu bildiğiniz bir kimlik jetonunu inceleyerek SHA-512 karmasını alabilirsiniz.

JWT kitaplıkları, bu doğrulama görevlerinden bazılarını sizin yerinize gerçekleştirebilir. Örneğin, Java için Google Auth Kitaplığı'nı kullanarak:

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

Daha fazla ayrıntı için Google ile oturum açma belgelerini inceleyin.