Bağlı hesapla oturum açma, Google Hesabı'nı hizmetinize bağlamış olan kullanıcılar için Google ile tek dokunuşla oturum açma özelliğini etkinleştirir. Bu sayede kullanıcılar, kullanıcı adlarını ve şifrelerini yeniden girmeden tek bir tıklamayla oturum açabildikleri için deneyimleri iyileşir. Ayrıca, kullanıcıların hizmetinizde yinelenen hesaplar oluşturma olasılığını da azaltır.
Bağlı hesapla oturum açma, Android'de One Tap ile oturum açma akışının bir parçası olarak kullanılabilir. Bu nedenle, uygulamanızda One Tap özelliği zaten etkinse ayrı bir kitaplık içe aktarmanız gerekmez.
Bu belgede, Android uygulamanızı Bağlı Hesapla Oturum Açma'yı destekleyecek şekilde nasıl değiştireceğiniz açıklanmaktadır.
İşleyiş şekli
- One Tap ile oturum açma akışı sırasında bağlı hesapları göstermeyi etkinleştirirsiniz.
- Kullanıcı Google'da oturum açmışsa ve Google Hesabı'nı hizmetinizdeki hesabıyla bağlamışsa 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. Oturum açmış 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 makinenizde Google Play Hizmetleri'nin en son sürümünü edinin:
- Android SDK Manager'ı açın.
SDK Tools (SDK Araçları) bölümünde Google Play services (Google Play Hizmetleri) seçeneğini bulun.
Bu paketlerin durumu Yüklendi değilse her ikisini de seçip Paketleri Yükle'yi tıklayın.
Uygulamanızı yapılandırma
Proje düzeyindeki
build.gradledosyanızda, Google'ın Maven deposunu hembuildscripthem deallprojectsbölümüne ekleyin.buildscript { repositories { google() } } allprojects { repositories { google() } }"Google ile Bağlantı" API'sinin bağımlılıklarını, modülünüzün uygulama düzeyindeki Gradle dosyasına (genellikle
app/build.gradle) ekleyin:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Android uygulamanızı, bağlı hesapla oturum açma özelliğini destekleyecek şekilde değiştirme
Bağlı hesapla oturum açma akışının sonunda, uygulamanıza bir kimlik jetonu döndürülür. Kullanıcının oturumunu açmadan önce kimlik jetonunun bütünlüğü doğrulanmalıdır.
Aşağıdaki kod örneğinde, kullanıcıyı almak, kimlik jetonunu doğrulamak ve ardından kullanıcı oturumunu açmak için gereken adımlar ayrıntılı olarak açıklanmaktadır.
Oturum açma amacının sonucunu almak için bir etkinlik oluşturun
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 İstemci Kitaplığı kullanma
Üretim ortamında Google kimliği jetonlarını doğrulamak için Java Google API İstemci Kitaplığı'nı kullanmanızı öneririz.
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 talebini, iss talebini ve exp talebini doğrular.
Kimlik jetonunun bir Google Workspace veya Cloud kuruluş hesabını temsil ettiğini doğrulamanız gerekiyorsa hd talebini, Payload.getHostedDomain() yöntemi tarafından döndürülen alan adını kontrol ederek doğrulayabilirsiniz.