Kimlik jetonlarını kullanarak oturum açma

Kullanıcının kimlik bilgilerini veya oturum açma ipuçlarını aldıktan sonra kimlik bilgisi için bir kimlik jetonu olup olmadığını kontrol edebilirsiniz. Kimlik jetonu, bir kullanıcının temel profil bilgilerini de içeren imzalı bir kullanıcı kimliğidir. Buna muhtemelen Google tarafından doğrulanmış bir e-posta adresi de dahildir. Kimlik jetonları mevcut olduğunda, bunları 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 kullanabilirsiniz.

Credential nesnesinin kullanıcı kimliği, cihazda oturum açmış bir Google hesabının kullanıcı kimliğiyle eşleştiğinde bir 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, bir Google API istemci kitaplığı veya genel amaçlı bir JWT kitaplığı kullanarak jetonu doğrulayın.

Başlamadan önce

Credentials nesnesinden kimlik jetonu alın

Bir kullanıcının kimlik bilgilerini aldıktan sonra Credentials nesnesinin kimlik jetonu içerip içermediğini kontrol edin. Varsa getIdTokens çağrısı yaparak dosyayı alı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çtaki kimlik jetonunu doğrulama

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

Şifreler için Smart Lock'taki aud kimlik jetonu talebi aşağıdaki biçimdedir:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

SHA512HASH değeri, imza 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 için gerçekleştirebilir. Örneğin Java için Google API istemci 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 bilgi için Google ile Oturum Açma belgelerine bakın.