Google Hesapları ile oturum açmayı destekliyorsanız kullanıcılarınıza uygulamanızın bağlamından çıkmalarını gerektirmeyen sorunsuz bir hesap oluşturma deneyimi sunmak için One Tap oturum açma istemcisini kullanabilirsiniz.
One Tap kullanıcı arayüzünü görüntülediğinizde kullanıcılardan cihazlarındaki Google Hesaplarından birini kullanarak uygulamanızla yeni bir hesap oluşturmaları istenir. Kullanıcı devam etmeyi seçerse temel profil bilgilerini (ad, profil fotoğrafı ve doğrulanmış e-posta adresi) içeren bir kimlik jetonu alırsınız. Bu jetonu yeni hesabı oluşturmak için kullanabilirsiniz.
One Tap ile hesap oluşturma özelliğini uygulamak iki bölümden oluşur:
- One Tap istemcisini uygulamanıza entegre etme (bu sayfada açıklanmaktadır). Bu işlem, One Tap ile oturum açma işlemiyle büyük ölçüde aynıdır ancak yapılandırmada bazı farklılıklar vardır.
- Arka uçunuza, Google kimlik jetonlarından kullanıcı hesabı oluşturma özelliğini ekleyin. Bu özellik Arka uçta kimlik jetonlarını kullanma başlıklı makalede ele alınmıştır.
One Tap ile kaydolma özelliğini nerede kullanmalıyım?
Kullanıcılara One Tap ile Kaydolma'yı sunmanın en etkili yolu, oturum açmanın yeni özellikleri etkinleştireceği bir bağlamdır. Öncelikle, kullanıcının kayıtlı kimlik bilgileriyle oturum açmasını deneyin. Kayıtlı kimlik bilgisi yoksa kullanıcı için yeni bir hesap oluşturmayı teklif edin.
Başlamadan önce
Google API Konsolu projenizi ve Android projenizi Tek Tıklama ile Oturum Açma'yı kullanmaya başlama bölümünde açıklandığı şekilde ayarlayın.
1. One Tap istemcisini yapılandırma
Hesap oluşturma için One Tap istemcisini yapılandırmak üzere aşağıdakileri yapın:
- Şifre kimlik bilgisi isteklerini etkinleştirmeyin. (One Tap ile kaydolma yalnızca jeton tabanlı kimlik doğrulamasıyla mümkündür.)
setGoogleIdTokenRequestOptions()
ve aşağıdaki ayarları kullanarak Google kimlik jetonu isteklerini etkinleştirin:- Sunucu istemci kimliğini Google API'ler Konsolu'nda oluşturduğunuz kimliğe ayarlayın. Bunun 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. Diğer bir deyişle, yetkili hesaplara göre filtreleme yapmayın.
- İsterseniz 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ünün iptal durumunu takip etme
İsteminizi kapatarak veya dışındaki bir yere dokunarak kullanıcının One Tap ile kaydolmayı reddedip reddetmediğini takip etmeniz gerekir. Bu, etkinliğinizin Boole mülkü kadar basit olabilir. (Aşağıdaki Tek Dokunuş 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 Tek Dokunuş'u kullanmayı reddetmediyse istemci nesnesinin beginSignIn()
yöntemini çağırın ve döndürdüğü Task
değerine dinleyiciler ekleyin. Uygulamalar genellikle bu adımı, One Tap oturum açma isteği kayıtlı kimlik bilgisi bulamadığında, yani oturum açma isteğinin başarısızlık dinleyicisinde gerçekleştirir.
Kullanıcının cihazda ayarlanmış bir veya daha fazla Google Hesabı varsa One Tap istemcisi başarı dinleyicisini çağırır. Başarı dinleyicisinde, bekleyen intent'i Task
sonucundan alın ve Tek Dokunuş kullanıcı arayüzünü başlatmak için startIntentSenderForResult()
'a iletin.
Kullanıcının cihazında Google Hesabı yoksa One Tap istemcisi, hata dinleyiciyi çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez: Uygulamanın oturum kapalı deneyimini sunmaya devam edebilirsiniz. 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 Tek Dokunuşla Kaydolma istemiyle ilgili yanıtı, Etkinlik'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 dışında bir yere dokunarak kaydolmayı reddederse sonuç RESULT_CANCELED
koduyla döndürülür. Uygulamanızın her iki olasılığı da ele alması gerekir.
Google kimlik jetonu ile hesap oluşturma
Kullanıcı bir Google Hesabı ile kaydolmayı seçtiyse onActivityResult()
'teki intent verilerini One Tap istemcisinin getSignInCredentialFromIntent()
yöntemine ileterek kullanıcı için bir kimlik jetonu alabilirsiniz. Kimlik bilgisinde, null olmayan bir googleIdToken
mülkü bulunur.
Kimlik jetonunu kullanarak arka uçta hesap oluşturun (Kimlik jetonlarını kullanarak arka uçta kimlik doğrulama başlıklı makaleyi inceleyin) ve kullanıcının oturumunu açın.
Kimlik bilgisi, istediğiniz ek bilgileri de içerir (ör. 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ı reddettiyse getSignInCredentialFromIntent()
çağrısı, CommonStatusCodes.CANCELED
durum koduyla bir ApiException
oluşturur.
Bu durumda, kullanıcılarınızı tekrarlanan istemlerle rahatsız etmemek için One Tap oturum açma kullanıcı arayüzünü geçici olarak göstermeyi durdurmanız gerekir. Aşağıdaki örnekte, kullanıcıya Tek Dokunuş ile oturum açma özelliğinin sunulup sunulmayacağını belirlemek için Etkinlik'te bir özellik ayarlanarak bu işlem gerçekleştirilmektedir. Bununla birlikte, SharedPreferences
değerine bir değer kaydedebilir veya başka bir yöntem kullanabilirsiniz.
One Tap ile oturum açma istemleri için kendi hız sınırlamanızı uygulamanız önemlidir. Bunu yapmazsanız ve bir kullanıcı arka arkaya birkaç istemi iptal ederse One Tap istemcisi, kullanıcıya sonraki 24 saat boyunca 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
Bir kullanıcı Tek Dokunuş ile kaydolma akışını tamamladığında, bazı temel profil bilgilerini (kullanıcı e-posta adresi, tam ad ve profil resmi URL'si) içeren bir Google kimliği jetonu alırsınız. Birçok uygulamada bu bilgiler, arka uçta kullanıcının kimliğini doğrulamak ve yeni bir hesap oluşturmak için yeterlidir.
Hesap oluşturma işlemini tamamlamak için ek bilgilere (ör. kullanıcının doğum tarihi) ihtiyacınız varsa kullanıcıya bu ek bilgileri istediğiniz bir kayıt ayrıntıları akışı gösterin. Ardından, hesap oluşturma işlemini tamamlamak için bu bilgileri arka uç sunucunuza gönderin.