Kullanıcıdan, uygulamanızda oturum açmak için daha önce kullandığı kimlik bilgilerinden birini almak üzere izin istemek için One Tap ile oturum açma istemcisini kullanın. Bu kimlik bilgileri, Chrome, Android otomatik doldurma veya Şifreler için Smart Lock'u kullanarak Google'a kaydettiği bir Google Hesabı ya da kullanıcı adı-şifre kombinasyonu olabilir.
Kimlik bilgileri başarıyla alındığında, kullanıcıların uygulamanızda sorunsuz bir şekilde oturum açmasını sağlamak için bu bilgileri kullanabilirsiniz.
Kullanıcı herhangi bir kimlik bilgisi kaydetmediyse kullanıcı arayüzü gösterilmez ve normal oturum kapatma deneyiminizi sunabilirsiniz.
One Tap ile oturum açmayı nerede kullanmalıyım?
Uygulamanızda kullanıcıların oturum açması gerekiyorsa oturum açma ekranınızda One Tap kullanıcı arayüzünü gösterin. Bu özellik, "Google ile oturum açma" düğmeniz olsa bile faydalı olabilir. Bunun nedeni, One Tap kullanıcı arayüzünün yalnızca kullanıcının daha önce oturum açmak için kullandığı kimlik bilgilerini gösterecek şekilde yapılandırılabilmesidir. Bu sayede, nadiren oturum açan kullanıcılara son oturum açma şekillerini hatırlatabilir ve uygulamanızda yanlışlıkla yeni hesap oluşturmalarını önleyebilirsiniz.
Uygulamanızda oturum açma isteğe bağlıysa oturum açma ile geliştirilmiş deneyim sunan tüm ekranlarda One Tap ile oturum açma özelliğini kullanabilirsiniz. Örneğin, kullanıcılar oturumları kapalıyken uygulamanızda içeriklere göz atabiliyor ancak yalnızca oturum açtıktan sonra yorum gönderebiliyor veya alışveriş sepetine öğe ekleyebiliyorsa bu durum, One Tap ile oturum açma için mantıklı bir bağlamdır.
Oturum açma isteğe bağlı olan uygulamalar da yukarıda belirtilen nedenlerden dolayı oturum açma ekranlarında One Tap ile oturum açma'yı kullanmalıdır.
Başlamadan önce
- Google API Konsolu projenizi ve Android projenizi One Tap ile oturum açma'yı kullanmaya başlama bölümünde açıklandığı şekilde ayarlayın.
- Şifre tabanlı oturum açmayı destekliyorsanız uygulamanızı otomatik doldurma için optimize edin (veya Şifreler için Smart Lock'u kullanın) böylece kullanıcılar oturum açtıktan sonra şifre kimlik bilgilerini kaydedebilir.
1. One Tap ile oturum açma istemcisini yapılandırma
One Tap ile oturum açma istemcisini, kullanıcıların kayıtlı şifrelerle, kayıtlı Google Hesaplarıyla veya her ikisiyle de oturum açmasını sağlayacak şekilde yapılandırabilirsiniz. (Yeni kullanıcılar için tek dokunuşla hesap oluşturma ve mümkün olduğunca çok sayıda geri gelen kullanıcı için otomatik veya tek dokunuşla oturum açma özelliğini etkinleştirmek üzere her ikisinin de desteklenmesi önerilir.)
Uygulamanızda şifre tabanlı oturum açma kullanılıyorsa şifre kimliği isteklerini etkinleştirmek için setPasswordRequestOptions() öğesini kullanın.
Uygulamanız Google ile Oturum Açma'yı kullanıyorsa Google kimlik jetonu isteklerini etkinleştirmek ve yapılandırmak için setGoogleIdTokenRequestOptions() kullanın:
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.
Yetkili hesaplara göre filtreleme yapmak için istemciyi yapılandırın. Bu seçeneği etkinleştirdiğinizde One Tap istemcisi, kullanıcılardan yalnızca daha önce kullandıkları Google Hesaplarıyla uygulamanızda oturum açmalarını ister. Bu sayede, hesaplarının olup olmadığından veya hangi Google Hesabı'nı kullandıklarından emin olmayan kullanıcıların başarılı bir şekilde oturum açmasına yardımcı olabilir ve kullanıcıların uygulamanızda yanlışlıkla yeni hesaplar oluşturmasını önleyebilirsiniz.
Mümkün olduğunda kullanıcıların otomatik olarak oturum açmasını istiyorsanız
setAutoSelectEnabled()ile özelliği etkinleştirin. Aşağıdaki ölçütler karşılandığında otomatik oturum açma mümkündür:- Kullanıcının uygulamanız için tam olarak bir kimlik bilgisi kaydedilmiş olmalıdır. Yani, kaydedilmiş bir şifre veya kaydedilmiş bir Google Hesabı olmalıdır.
- Kullanıcı, Google Hesabı ayarlarında otomatik oturum açmayı devre dışı bırakmamıştır.
İsteğe bağlı olsa da oturum açma güvenliğini artırmak ve yeniden oynatma saldırılarını önlemek için nonce kullanmanızı önemle tavsiye ederiz. Her isteğe bir nonce eklemek için setNonce işlevini kullanın. Nonce oluşturmayla ilgili öneriler ve ek bilgiler için SafetyNet'in Nonce alma bölümüne bakın.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signInRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.default_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build(); // ... } // ... }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signInRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signInRequest = BeginSignInRequest.builder() .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder() .setSupported(true) .build()) .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Only show accounts previously used to sign in. .setFilterByAuthorizedAccounts(true) .build()) // Automatically sign in when exactly one credential is retrieved. .setAutoSelectEnabled(true) .build() // ... } // ... }
2. Oturum açmış kullanıcı olup olmadığını kontrol etme
Etkinliğiniz oturum açmış veya oturumu kapatmış bir kullanıcı tarafından kullanılabilecekse One Tap ile oturum açma kullanıcı arayüzünü göstermeden önce kullanıcının durumunu kontrol edin.
Ayrıca, kullanıcının istemi kapatarak veya istemin dışına dokunarak One Tap ile oturum açmayı reddedip etmediğini de 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 oturum açma kullanıcı arayüzünü görüntüleme
Kullanıcı oturum açmamışsa ve One Tap ile oturum açma'yı kullanmayı reddetmemişse:
istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task öğesine işleyiciler ekleyin. Uygulamalar genellikle bunu Activity'nin onCreate() yönteminde veya tek Activity mimarisi kullanılırken ekran geçişlerinden sonra yapar.
Kullanıcının uygulamanız için kayıtlı kimlik bilgileri varsa One Tap istemcisi başarı işleyicisini çağırır. Başarı işleyicisinde, Task sonucundan bekleyen intent alınır ve One Tap ile oturum açma kullanıcı arayüzünü başlatmak için startIntentSenderForResult()'ye iletilir.
Kullanıcının kayıtlı kimlik bilgisi yoksa One Tap istemcisi, hata işleyicisini çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulamanın oturum kapalı deneyimini sunmaya devam edebilirsiniz. Ancak tek dokunmayla kaydolmayı destekliyorsanız sorunsuz bir hesap oluşturma deneyimi için bu akışı buradan başlatabilirsiniz. Tek dokunuşla yeni hesaplar oluşturma başlıklı makaleye göz atın.
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 saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signInRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0, null)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and 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 oturum açma istemine verdiği yanıt, etkinliğinizin onActivityResult() yöntemi kullanılarak uygulamanıza bildirilir. Kullanıcı oturum açmayı seçtiyse sonuç, kaydedilmiş bir kimlik bilgisi olur. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya arayüzün dışına dokunarak oturum açmayı reddederse sonuç, RESULT_CANCELED koduyla birlikte döndürülür. Uygulamanızın her iki olasılığı da ele alması gerekir.
Alınan kimlik bilgileriyle oturum açma
Kullanıcı, kimlik bilgilerini uygulamanızla paylaşmayı seçtiyse onActivityResult() kimlik bilgilerini One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek alabilirsiniz. Kullanıcı, uygulamanızla bir Google Hesabı kimlik bilgisi paylaştıysa kimlik bilgisinin googleIdToken özelliği boş olmayan bir değer içerir. Kullanıcı, kayıtlı bir şifre paylaştıysa kimlik bilgisinin password özelliği boş olmayan bir değer içerir.
Uygulamanızın arka ucunda kimlik doğrulaması yapmak için kimlik bilgisini kullanın.
- Bir kullanıcı adı ve şifre çifti alındıysa bunları, kullanıcı manuel olarak girmiş gibi oturum açmak için kullanın.
Google Hesabı kimlik bilgileri alındıysa arka uçta kimlik doğrulaması yapmak için kimlik jetonunu kullanın. Yeniden oynatma saldırılarını önlemeye yardımcı olması için tek seferlik rastgele sayı kullanmayı seçtiyseniz arka uç sunucunuzdaki yanıt değerini kontrol edin. Kimlik jetonlarını kullanarak bir arka uçla kimlik doğrulama başlıklı makaleyi inceleyin.
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(); String username = credential.getId(); String password = credential.getPassword(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } else if (password != null) { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password."); } } 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 val username = credential.id val password = credential.password when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } password != null -> { // Got a saved username and password. Use them to authenticate // with your backend. Log.d(TAG, "Got password.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token or password!") } } } 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 devre dışı bırakmanız gerekir. Aşağıdaki örnek, kullanıcıya One Tap ile oturum açma özelliğini sunup sunmayacağını belirlemek için kullandığı Etkinlik'te bir özellik ayarlayarak bunu gerçekleştirir. Ancak SharedPreferences'ya bir değer de kaydedebilir veya başka bir yöntem 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})") } } } } } } // ... }
5. Oturumu kapatma
Bir kullanıcı uygulamanızın oturumunu kapattığında One Tap istemcisinin signOut() yöntemini çağırın.
signOut() aranırsa kullanıcı tekrar oturum açana kadar otomatik oturum açma devre dışı bırakılır.
Otomatik oturum açmayı kullanmasanız bile bu adım önemlidir. Çünkü kullanıcılar uygulamanızdan oturumu kapattığında kullandığınız Play Hizmetleri API'lerinin kimlik doğrulama durumunun da sıfırlanmasını sağlar.
Sonraki adımlar
One Tap istemcisini Google kimlik bilgilerini alacak şekilde yapılandırdıysanız uygulamanız artık kullanıcılarınızın Google Hesaplarını temsil eden Google kimlik jetonlarını alabilir. Bu jetonları arka uçta nasıl kullanabileceğinizi öğrenin.
Google ile Giriş'i destekliyorsanız uygulamanıza sorunsuz hesap oluşturma akışları eklemek için Tek Dokunma istemcisini de kullanabilirsiniz.