Google Hesaplarıyla oturum açmayı destekliyorsanız kullanıcılarınıza sorunsuz bir hesap oluşturma deneyimi sunmak için One Tap ile oturum açma istemcisini de kullanabilirsiniz. Bu deneyim, kullanıcıları uygulamanızın bağlamından asla çıkarmaz.
One Tap kullanıcı arayüzünü gösterdiğinizde, kullanıcılardan cihazlarındaki Google Hesaplarından birini kullanarak uygulamanızda yeni bir hesap oluşturmaları istenir. Kullanıcı devam etmeyi seçerse yeni hesabı oluşturmak için kullanabileceğiniz, temel profil bilgilerini (ad, profil fotoğrafı ve doğrulanmış e-posta adresi) içeren bir kimlik jetonu alırsınız.
One Tap ile hesap oluşturma işleminin iki bölümü vardır:
- Bu sayfada açıklanan One Tap istemcisini uygulamanıza entegre etme Bu yöntem, One Tap ile oturum açmaya benzer ancak yapılandırma açısından bazı farklılıklar vardır.
- Arka uçta kimlik jetonlarını kullanma bölümünde ele alınan, Google kimlik jetonlarından kullanıcı hesapları oluşturma özelliğini arka ucunuza ekleme.
One Tap ile kaydolma özelliğini nerede kullanmalıyım?
Kullanıcılara One Tap ile kaydolma özelliğini sunmak için en etkili yer, oturum açmanın yeni özellikleri etkinleştireceği bir bağlamdır. Öncelikle, kullanıcıyı kayıtlı bir kimlik bilgisiyle oturum açmaya çalışın. Kayıtlı kimlik bilgisi bulunamazsa kullanıcıya yeni bir hesap oluşturmayı teklif edin.
Başlamadan önce
Google API Konsolu projenizi ve Android projenizi One Tap ile oturum açma bölümünde açıklandığı şekilde ayarlayın.
1. One Tap istemcisini yapılandırma
One Tap istemcisini hesap oluşturma için yapılandırmak üzere aşağıdakileri yapın:
- Şifre kimlik bilgisi isteklerini etkinleştirmeyin. (Tek dokunuşla kaydolma yalnızca jeton tabanlı kimlik doğrulama ile mümkündür.)
setGoogleIdTokenRequestOptions()ve aşağıdaki ayarları kullanarak Google kimlik jetonu isteklerini etkinleştirin:- Sunucu istemci kimliğini Google API'leri Konsolu'nda oluşturduğunuz kimlik olarak ayarlayın. Bu kimliğin, Android istemci kimliğiniz değil, sunucunuzun istemci kimliği olduğunu unutmayın.
- İstemciyi, cihazdaki tüm Google Hesaplarını gösterecek şekilde yapılandırın. Yani yetkili hesaplara göre filtrelemeyin.
- İsteğe bağlı olarak, hesap için doğrulanmış telefon numarasını da isteyebilirsiniz.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. One Tap kullanıcı arayüzü iptalini takip etme
Kullanıcının, istemi kapatarak veya istemin dışına dokunarak Tek Dokunmayla Kaydolma'yı kullanmayı reddedip etmediğini takip etmeniz gerekir. Bu, etkinliğinizin Boole özelliği kadar basit olabilir. (Aşağıdaki One Tap kullanıcı arayüzünü göstermeyi durdurma bölümüne bakın.)
3. One Tap ile kaydolma kullanıcı arayüzünü görüntüleme
Kullanıcı, yeni hesap oluşturmak için One Tap özelliğini kullanmayı reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task öğesine işleyiciler ekleyin. Uygulamalar genellikle bu adımı, One Tap ile oturum açma isteğinde kayıtlı kimlik bilgisi bulunmadığında (yani oturum açma isteğinin hata işleyicisinde) gerçekleştirir.
Kullanıcının cihazında bir veya daha fazla Google Hesabı ayarlanmışsa One Tap istemcisi başarı dinleyicisini çağırır. Başarı işleyicisinde, Task sonucundan bekleyen intent'i alın ve One Tap kullanıcı arayüzünü başlatmak için startIntentSenderForResult() öğesine iletin.
Kullanıcının cihazında Google Hesabı yoksa One Tap istemcisi, hata işleyicisini çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez: Uygulamanın oturum kapatılmış deneyimini sunmaya devam edebilirsiniz ve kullanıcı, normal hesap oluşturma akışınızla kaydolabilir.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Kullanıcının yanıtını işleme
Kullanıcının One Tap ile kaydolma istemine verdiği yanıt, etkinliğinizin onActivityResult() yöntemi kullanılarak uygulamanıza bildirilir. Kullanıcı hesap oluşturmayı seçtiyse sonuç bir Google kimlik jetonu olur. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya arayüzün dışına dokunarak kaydolmayı reddederse sonuç RESULT_CANCELED koduyla döndürülür. Uygulamanızın her iki olasılığı da ele alması gerekir.
Google kimliği jetonuyla hesap oluşturma
Kullanıcı Google Hesabı ile kaydolmayı seçtiyse onActivityResult()'dan gelen amaç verilerini One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek kullanıcı için bir kimlik jetonu alabilirsiniz. Kimlik bilgisinde boş olmayan bir googleIdToken özelliği bulunur.
Arka uçunuzda hesap oluşturmak için kimlik jetonunu kullanın (bkz. Kimlik jetonlarını kullanarak arka uçta kimlik doğrulama) ve kullanıcının oturumunu açın.
Kimlik bilgisi, talep ettiğiniz ek ayrıntıları da içerir. Örneğin, varsa hesabın doğrulanmış telefon numarası.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
One Tap kullanıcı arayüzünü göstermeyi durdurma
Kullanıcı oturum açmayı reddederse getSignInCredentialFromIntent() çağrısı, CommonStatusCodes.CANCELED durum koduyla ApiException oluşturur.
Bu durumda, kullanıcılarınızı tekrarlanan istemlerle rahatsız etmemek için One Tap ile oturum açma kullanıcı arayüzünü geçici olarak göstermeyi durdurmanız gerekir. Aşağıdaki örnekte, kullanıcıya One Tap ile oturum açma seçeneği sunulup sunulmayacağını belirlemek için kullanılan Etkinlik'te bir özellik ayarlanarak bu işlem gerçekleştirilir. Ancak, SharedPreferences öğesine bir değer de kaydedebilir veya başka bir yöntem de kullanabilirsiniz.
One Tap ile oturum açma istemleri için kendi sıklık sınırlamanızı uygulamanız önemlidir. Aksi takdirde, kullanıcı art arda birkaç istemi iptal ederse One Tap istemcisi 24 saat boyunca kullanıcıya istem göstermez.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
Sonraki adımlar
Kullanıcı, One Tap ile kaydolma akışını tamamladığında bazı temel profil bilgilerini içeren bir Google kimlik jetonu alırsınız: kullanıcının e-posta adresi, tam adı ve profil resmi URL'si. Bu bilgiler, birçok uygulamada kullanıcının kimliğini arka uçta doğrulamanız ve yeni bir hesap oluşturmanız için yeterlidir.
Hesap oluşturma işlemini tamamlamak için ek bilgiye (ör. kullanıcının doğum tarihi) ihtiyacınız varsa kullanıcıya, bu ek bilgiyi istediğiniz bir kayıt ayrıntıları akışı sunun. Ardından, hesap oluşturma işlemini tamamlamak için bu bilgiyi arka uçunuza gönderin.