Bağlı Hesapla Oturum Açma özelliği, Google Hesapları hizmetinize bağlı olan kullanıcılar için Google ile One Tap ile Oturum Açma özelliğini etkinleştirir. Bu sayede kullanıcılar, kullanıcı adlarını ve şifrelerini yeniden girmek zorunda kalmadan tek tıklamayla oturum açabilir. Ayrıca, kullanıcıların hizmetinizde yinelenen hesaplar oluşturma olasılığını da azaltır.
Bağlı Hesapla Oturum Açma özelliği, Android için Tek Dokunuşla Oturum Açma akışında kullanılabilir. Yani uygulamanızda Tek Dokunuş özelliği zaten etkinse ayrı bir kitaplığı içe aktarmanız gerekmez.
Bu dokümanda, Android uygulamanızı Bağlı Hesap ile oturum açma özelliğini destekleyecek şekilde nasıl değiştireceğiniz açıklanmaktadır.
İşleyiş şekli
- Tek Dokunuşla Oturum Açma akışında bağlı hesapları göstermeyi etkinleştirirseniz.
- Kullanıcı Google'da oturum açtıysa ve Google Hesabını hizmetinizdeki hesabına bağladıysa bağlı hesap için bir kimlik jetonu döndürülür.
- Kullanıcıya, bağlı hesabıyla hizmetinizde oturum açma seçeneği sunan One Tap ile oturum açma istemi gösterilir.
- Kullanıcı bağlı hesapla devam etmeyi seçerse kullanıcının kimlik jetonu uygulamanıza döndürülür. Giriş yapan kullanıcıyı tanımlamak için bu jetonu 2. adımda sunucunuza gönderilen jetonla eşleştirirsiniz.
Kurulum
Geliştirme ortamınızı kurma
Geliştirme ana makinenize en son Google Play Hizmetleri'ni yükleyin:
- Android SDK Yöneticisi'ni açın.
SDK Tools (SDK Araçları) bölümünde Google Play Hizmetleri'ni bulun.
Bu paketlerin durumu Yüklü değilse ikisini de seçip Paketleri Yükle'yi tıklayın.
Uygulamanızı yapılandırma
Proje düzeyindeki
build.gradle
dosyanızda, Google'ın Maven deposunu hembuildscript
hem deallprojects
bölümünüze ekleyin.buildscript { repositories { google() } } allprojects { repositories { google() } }
"Google ile Bağlan" API'sine ait bağımlılıkları, modülünüzün uygulama düzeyindeki Gradle dosyasına ekleyin. Bu dosya genellikle
app/build.gradle
şeklindedir:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Android uygulamanızı, Bağlı Hesap oturum açma özelliğini destekleyecek şekilde değiştirme
Bağlı Hesap Oturum Açma akışının sonunda uygulamanıza bir kimlik jetonu döndürülür. Kullanıcının oturumu açılmadan önce kimlik jetonunun bütünlüğü doğrulanmalıdır.
Aşağıdaki kod örneğinde, kimlik jetonunu alma, kimlik jetonunu doğrulama ve ardından kullanıcıyı oturum açtırma adımları ayrıntılı olarak açıklanmıştır.
Oturum açma intent'inin sonucunu almak için etkinlik oluşturma
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }
Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });
Oturum açma isteğini oluşturma
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Oturum Açma Beklemede intent'ini başlatma
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }
Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
Kimlik jetonunun bütünlüğünü doğrulama
Google API istemci kitaplığı kullanma
Üretim ortamında Google kimlik jetonlarını doğrulamak için önerilen yöntem Java Google API İstemci Kitaplığı'nı kullanmaktır.
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;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
GoogleIdTokenVerifier.verify()
yöntemi, JWT imzasını, aud
hak talebini, iss
hak talebini ve exp
hak talebini doğrular.
Kimlik jetonunun bir Google Workspace veya Cloud kuruluş hesabını temsil ettiğini doğrulamanız gerekiyorsa Payload.getHostedDomain()
yönteminin döndürdüğü alan adını kontrol ederek hd
iddiasını doğrulayabilirsiniz.