Google Hesaplarıyla oturum açmayı destekliyorsanız, kullanıcılarınıza uygulamanızın bağlamını dışına çıkarmayacak 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 (kullanıcının adı, profil fotoğrafı ve doğrulanmış e-posta adresi) içeren bir kimlik jetonu alırsınız. Bunları yeni hesap oluşturmak için kullanabilirsiniz.
One Tap hesap oluşturma işleminin iki aşaması vardır:
- One Tap istemcisini uygulamanıza entegre etme (bu sayfada açıklanmaktadır). Bu, çoğunlukla One Tap ile oturum açmanın kullanımıyla aynıdır ancak yapılandırmada bazı farklılıklar vardır.
- Arka ucunuza, Google kimlik jetonlarından kullanıcı hesapları oluşturma olanağı ekleme. Bu konu, Arka uçta kimlik jetonlarını kullanma bölümünde ele alınmıştır.
One Tap ile kaydolmayı nerede kullanmalıyım?
Kullanıcılara One Tap ile kaydolma seçeneği sunmak için en etkili yer, oturum açmanın yeni özellikleri etkinleştireceği bir bağlamdır. Önce, kayıtlı bir kimlik bilgisi ile kullanıcının oturumunu açmayı deneyin. Kayıtlı kimlik bilgisi bulunamazsa kullanıcı için yeni bir hesap oluşturmayı teklif edin.
Başlamadan önce
Google API'leri konsol projenizi ve Android projenizi One Tap ile oturum açmaya başlama bölümünde açıklandığı şekilde oluşturun.
1. One Tap istemcisini yapılandırma
One Tap istemcisini hesap oluşturma işlemi 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ğrulamayla mümkündür.)
setGoogleIdTokenRequestOptions()
özelliğini ve şu ayarları kullanarak Google kimliği jetonu isteklerini etkinleştirin:- Sunucu istemci kimliğini, Google API'leri konsolunda oluşturduğunuz kimlik olarak 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. Yani yetkili hesaplara göre filtreleme yapmayın.
- İ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ü iptallerini takip edin
Kullanıcının One Tap ile kaydolmayı kullanmayı reddedip reddetmediğini görmek için istemi kapatın veya seçeneğin dışına dokunun. Bu, Etkinliğinizin bir boole özelliği kadar basit olabilir. (Aşağıdaki One Tap kullanıcı arayüzünün gösterilmesini durdurma bölümüne bakın.)
3. One Tap ile kaydolma kullanıcı arayüzünü göster
Kullanıcı, yeni bir hesap oluşturmak için One Tap'i 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ği kayıtlı herhangi bir kimlik bilgisi bulamadığında (yani, oturum açma isteğinin hata işleyicisinde) bulur.
Kullanıcının cihazında bir veya daha fazla Google Hesabı ayarlanmışsa One Tap istemcisi, başarılı dinleyiciyi arar. Başarı işleyicide, Task
sonucundan beklemedeki niyeti alın ve One Tap kullanıcı arayüzünü başlatmak için startIntentSenderForResult()
öğesine iletin.
Kullanıcının cihazda Google Hesabı yoksa One Tap istemcisi hata dinleyicisini arar. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulama oturumu kapalıyken uygulamayı sunmaya devam edebilirsiniz ve kullanıcı normal hesap oluşturma akışınıza 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 raporlanır. Kullanıcı hesap oluşturmayı seçtiyse sonuç bir Google kimliği jetonu olur. Kullanıcı,
One Tap kullanıcı arayüzünü kapatarak veya kullanıcı arayüzünün dışına dokunarak
kaydolmayı reddettiyse sonuç, RESULT_CANCELED
kodunu döndürecektir. Uygulamanızın her iki olasılığı da işlemesi gerekir.
Google kimlik jetonuyla hesap oluşturma
Kullanıcı bir Google Hesabı ile kaydolmayı tercih ettiyse amaç verilerini onActivityResult()
ürününden One Tap istemcisinin getSignInCredentialFromIntent()
yöntemine ileterek kullanıcı için bir kimlik jetonu alabilirsiniz. Kimlik bilgisi, boş olmayan bir googleIdToken
özelliğine sahip olur.
Arka ucunuzda bir hesap oluşturmak için kimlik jetonunu kullanın (bkz. Kimlik jetonları kullanarak arka uçla kimlik doğrulama) ve kullanıcının oturumunu açın.
Kimlik bilgisi, varsa hesabın doğrulanmış telefon numarası gibi istediğiniz ek ayrıntıları da içerir.
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()
numaralı telefona yapılan çağrı, CommonStatusCodes.CANCELED
durum kodunu içeren bir ApiException
hatası verir.
Bu durumda, yinelenen istemlerle kullanıcılarınızı rahatsız etmemek için One Tap oturum açma kullanıcı arayüzünü geçici olarak durdurmanız gerekir. Aşağıdaki örnekte bunun için, Etkinlik'te bir mülk ayarlayarak kullanıcıya One Tap ile oturum açma izni verilip verilmeyeceğini belirleyebilirsiniz. Ancak SharedPreferences
öğesine bir değer kaydedebilir veya başka bir yöntem kullanabilirsiniz.
One Tap oturum açma istemleri için kendi hız sınırlamanızı uygulamanız önemlidir. Aksi takdirde kullanıcı art arda birkaç istemi iptal ederse One Tap istemcisi sonraki 24 saat boyunca kullanıcıdan onay ister.
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 kayıt akışını tamamladığında bir Google kimlik jetonu alırsınız. Bu jeton bazı temel profil bilgilerini içerir: kullanıcının e-posta adresi, tam adı ve profil resmi URL'si. Çoğu uygulamada bu bilgiler arka uçta kullanıcının kimliğini 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) ihtiyaç duyuyorsanız, kullanıcıya kayıt ayrıntıları akışını sunarak bu ek bilgileri talep edin. Ardından hesap oluşturma işlemini tamamlamak için bu bilgileri arka ucunuza gönderin.