Kullanıcıların kayıtlı kimlik bilgileriyle oturum açma

Kullanıcının uygulamanızda oturum açmak için daha önce kullandığı kimlik bilgilerinden birini almak üzere One Tap ile oturum açma istemcisini kullanın. Bu kimlik bilgileri, Google Hesabı veya Chrome, Android Otomatik Doldurma ya da Şifreler için Smart Lock kullanarak Google'a kaydettiği bir kullanıcı adı-şifre kombinasyonu olabilir.

Tek dokunuşla oturum açma kullanıcı arayüzü

Kimlik bilgileri başarıyla alındığında, kullanıcıyı uygulamanızda sorunsuz bir şekilde oturum açmak için 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çma özelliğini 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. "Google ile oturum aç" düğmeniz olsa bile bu özellik faydalı olabilir: One Tap kullanıcı arayüzü, yalnızca kullanıcının daha önce oturum açmak için kullandığı kimlik bilgilerini gösterecek şekilde yapılandırılabildiğinden, seyrek oturum açan kullanıcılara en son nasıl oturum açtıklarını hatırlatabilir ve yanlışlıkla uygulamanızda yeni hesaplar oluşturmalarını önleyebilir.

Uygulamanızda oturum açmak isteğe bağlıysa oturum açarak deneyimin iyileştirildiği tüm ekranlarda One Tap ile oturum açma özelliğini kullanabilirsiniz. Örneğin, kullanıcılar oturum açmadan uygulamanızla içeriklere göz atabiliyor ancak yalnızca oturum açtıktan sonra yorum gönderebiliyor veya alışveriş sepetine ürün ekleyebiliyorsa bu, One Tap ile oturum açma için mantıklı bir bağlam olur.

Oturum açmanın isteğe bağlı olduğu uygulamalar da aynı nedenlerle oturum açma ekranlarında One Tap ile oturum açma özelliğini kullanmalıdır.

Başlamadan önce

1. One Tap ile oturum açma istemcisini yapılandırma

Tek Dokunuşla oturum açma istemcisini, kullanıcıların kayıtlı şifrelerle, kayıtlı Google Hesaplarıyla veya her ikisiyle oturum açmasını sağlayacak şekilde yapılandırabilirsiniz. (Yeni kullanıcılar için tek dokunuşla hesap oluşturmayı ve mümkün olduğunca çok sayıda geri gelen kullanıcı için otomatik veya tek dokunuşla oturum açmayı etkinleştirmek amacıyla her ikisinin de desteklenmesi önerilir.)

Uygulamanız şifre tabanlı oturum açma kullanıyorsa şifre kimlik bilgisi isteklerini etkinleştirmek için setPasswordRequestOptions() kullanın.

Uygulamanız Google ile Oturum Açma özelliğini kullanıyorsa Google kimlik jetonu isteklerini etkinleştirmek ve yapılandırmak için setGoogleIdTokenRequestOptions() kullanın:

  • Sunucu istemci kimliğini Google Cloud Console'da oluşturduğunuz kimlik olarak ayarlayın. Bunun Android istemci kimliğiniz değil, sunucunuzun istemci kimliği olduğunu unutmayın.

  • İstemciyi, yetkilendirilmiş hesaplara göre filtreleme yapacak şekilde yapılandırın. Bu seçeneği etkinleştirdiğinizde One Tap istemcisi, kullanıcılardan yalnızca geçmişte kullandıkları Google Hesapları ile uygulamanızda oturum açmalarını ister. Bu sayede, kullanıcılar zaten bir hesapları olup olmadığından veya hangi Google Hesabı'nı kullandıklarından emin olmadıklarında başarılı bir şekilde oturum açabilir ve uygulamanızda yanlışlıkla yeni hesaplar oluşturmaları önlenir.

  • 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 bir kayıtlı şifre veya bir kayıtlı Google Hesabı.
    • Kullanıcı, Google Hesabı ayarlarında otomatik oturum açmayı devre dışı bırakmamış olmalıdır.
  • İsteğe bağlı olsa da oturum açma güvenliğini artırmak ve tekrar oynatma saldırılarını önlemek için tek seferlik rastgele sayı kullanmanızı önemle tavsiye ederiz. Her isteğe tek seferlik rastgele sayı eklemek için setNonce yöntemini kullanın. Tek seferlik rastgele sayı oluşturmayla ilgili öneriler ve ek ayrıntılar için SafetyNet'in Tek seferlik rastgele sayı 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 oturum açmamış bir kullanıcı tarafından kullanılabiliyorsa tek dokunuşla oturum açma kullanıcı arayüzünü göstermeden önce kullanıcının durumunu kontrol edin.

Kullanıcının, istemi kapatarak veya istemin dışına dokunarak One Tap ile oturum açma özelliğini kullanmayı reddedip reddetmediğini de takip etmeniz gerekir. Bu, etkinliğinizin boole özelliği olabilir. (Aşağıdaki Tek Dokunuş 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österme

Kullanıcı oturum açmadıysa ve One Tap ile oturum açma özelliğini kullanmayı reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task nesnesine işleyiciler ekleyin. Uygulamalar bunu genellikle etkinliğin onCreate() yönteminde veya tek etkinlik mimarisi kullanırken ekran geçişlerinden sonra yapar.

  • Kayıtlı kimlik bilgileri bulundu: Kullanıcının uygulamanız için kayıtlı kimlik bilgileri varsa One Tap istemcisi, başarılı işleyiciyi çağırır. Başarılı işleyicide, Task sonucundan beklemede olan intent'i alın ve One Tap ile oturum açma kullanıcı arayüzünü başlatmak için startIntentSenderForResult() öğesine iletin.
  • Kayıtlı kimlik bilgisi bulunamadı: One Tap istemcisi, hata dinleyiciyi çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulamanın oturum kapatılmış deneyimini sunmaya devam edebilirsiniz. Ancak One Tap ile kaydolma özelliğini destekliyorsanız sorunsuz bir hesap oluşturma deneyimi için bu akışı buradan başlatabilirsiniz. Tek dokunuşla yeni hesap oluşturma başlıklı makaleyi inceleyin.

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çerse 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ı reddettiyse sonuç, RESULT_CANCELED koduyla döndürülür. Uygulamanızın her iki olasılığı da işlemesi gerekir.

Alınan kimlik bilgileriyle oturum açma

Kullanıcı, kimlik bilgilerini uygulamanızla paylaşmayı seçtiyse onActivityResult() öğesinden gelen intent verilerini One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek bu bilgileri alabilirsiniz. Kullanıcı, uygulamanızla bir Google Hesabı kimlik bilgisi paylaştıysa kimlik bilgisinin boş olmayan bir googleIdToken özelliği, kayıtlı bir şifre paylaştıysa boş olmayan bir password özelliği olur.

Uygulamanızın arka ucuyla kimlik doğrulaması yapmak için kimlik bilgilerini kullanın.

  • Bir kullanıcı adı ve şifre çifti alındıysa bunları, kullanıcının manuel olarak sağladığı şekilde oturum açmak için kullanın.
  • Google Hesabı kimlik bilgileri alındıysa arka ucunuzda kimlik doğrulaması yapmak için kimlik jetonunu kullanın. Yeniden oynatma saldırılarını önlemek için tek seferlik rastgele sayı kullanmayı seçtiyseniz arka uç sunucunuzdaki yanıt değerini kontrol edin. Kimlik jetonlarını kullanarak 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) {
                      // ...
                  }
              }
          }
      }
      // ...
  }

Tek Dokunuş kullanıcı arayüzünü göstermeyi durdurma

Kullanıcı oturum açmayı reddettiyse getSignInCredentialFromIntent() çağrısı, CommonStatusCodes.CANCELED durum koduna sahip bir ApiException hatası verir. 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 örnekte, Etkinlik'te bir özellik ayarlanarak bu işlem gerçekleştirilir. Bu özellik, kullanıcıya Tek Dokunuşla oturum açma özelliğinin sunulup sunulmayacağını belirlemek için kullanılır. Ancak, SharedPreferences için 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. Bunu yapmazsanız ve bir kullanıcı arka arkaya birkaç istemi iptal ederse One Tap istemcisi, sonraki 24 saat boyunca kullanıcıdan istemde bulunmaz.

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. Oturum kapatma işlemini yönetme

Kullanıcı uygulamanızda oturumu kapattığında One Tap istemcisinin signOut() yöntemini çağırın. signOut() çağrısı, kullanıcı tekrar oturum açana kadar otomatik oturum açmayı devre dışı bırakır.

Otomatik oturum açma özelliğini kullanmasanız bile bu adım önemlidir. Bu adım, kullanıcılar uygulamanızda oturumu kapattığında kullandığınız tüm Play Hizmetleri API'lerinin kimlik doğrulama durumunun da sıfırlanmasını sağlar.

Sonraki adımlar

Tek Dokunuş 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 Oturum Açma'yı destekliyorsanız One Tap istemcisini kullanarak uygulamanıza sorunsuz hesap oluşturma akışları ekleyebilirsiniz.