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

Daha önce uygulamanızda oturum açmak için kullandığı kimlik bilgilerinden birini almak üzere kullanıcıdan izin istemek için One Tap 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ı veya 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ının uygulamanızda oturum açmasını sorunsuz bir şekilde sağlamak için bunları kullanabilirsiniz.

Kullanıcı herhangi bir kimlik bilgisi kaydetmediyse herhangi bir kullanıcı arayüzü sunulmaz ve normal oturumunuz kapalıyken kendi deneyiminizi sağlayabilirsiniz.

One Tap ile oturum açma özelliğini nerede kullanmalıyım?

Uygulamanız kullanıcıların oturum açmasını gerektiriyorsa oturum açma ekranınızda One Tap kullanıcı arayüzünü görüntüleyin. Halihazırda "Google ile oturum aç" düğmeniz olsa bile bu işlem faydalı olabilir: One Tap kullanıcı arayüzü, kullanıcının daha önce yalnızca oturum açmak için kullandığı kimlik bilgilerini gösterecek şekilde yapılandırılabildiğinden, son sefer nadiren oturum açan kullanıcılara hatırlatma gönderebilir ve uygulamanızla yanlışlıkla yeni hesap oluşturmalarını engelleyebilir.

Uygulamanız için oturum açmak isteğe bağlıysa, oturum açarak gelişmiş bir deneyim sunan herhangi bir ekranda One Tap ile oturum açmayı kullanabilirsiniz. Örneğin, kullanıcılar oturum açmadan uygulamanızdaki içeriklere göz atabiliyorsa ancak oturum açtıktan sonra yalnızca yorum yayınlayabiliyor veya alışveriş sepetine ürün ekleyebiliyorsa bu, One Tap ile oturum açmak için mantıklı bir bağlam olur.

Oturum açmayla ilgili isteğe bağlı uygulamalar da yukarıda belirtilen nedenlerden dolayı, oturum açma ekranlarında One Tap ile oturum açma özelliğini kullanmalıdır.

Başlamadan önce

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

One Tap oturum açma istemcisini, kullanıcıların kayıtlı şifreleriyle, kayıtlı Google Hesaplarıyla veya bu iki seçenekten biriyle 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() uygulamasını kullanın.

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

  • 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.

  • Müşteriyi yetkili hesaplara göre filtreleyecek ş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 şekilde, kullanıcıların bir hesaba sahip olup olmadıklarından veya hangi Google Hesabı'nı kullandıklarından emin olmadıklarında başarılı bir şekilde oturum açabilir ve kullanıcıların uygulamanızla yanlışlıkla yeni hesaplar oluşturmalarını önlerler.

  • Mümkün olduğunda kullanıcıların otomatik olarak oturum açmasını istiyorsanız setAutoSelectEnabled() ile bu özelliği etkinleştirin. Aşağıdaki kriterler karşılandığında otomatik oturum açma yapılabilir:

    • Kullanıcının, uygulamanız için kaydedilmiş tam olarak bir kimlik bilgisi, yani bir kayıtlı şifre veya kayıtlı bir Google Hesabı vardır.
    • 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 bir sayı kullanmanızı önemle tavsiye ederiz. Her isteğe bir tek seferlik rastgele eklemek için setNonce kullanın. Tek seferlik bir rastgele sayı oluşturmayla ilgili öneriler ve ek ayrıntılar için SafetyNet'in Tek seferlik bir rastgele sayı elde etme 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 edin

Etkinliğiniz, oturum açmış veya oturumu kapatmış bir kullanıcı tarafından kullanılabiliyorsa One Tap ile oturum açma kullanıcı arayüzünü görüntülemeden önce kullanıcının durumunu kontrol edin.

Ayrıca, kullanıcının One Tap ile oturum açma özelliğini kullanmayı reddedip reddetmediğini görmek için istemi kapatın veya ekranın 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 oturum açma kullanıcı arayüzünü görüntüleme

Kullanıcı oturum açmamışsa ve One Tap ile oturum açmayı kullanmayı reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task öğesine işleyiciler ekleyin. Uygulamalar genellikle bunu Etkinlik'in onCreate() yöntemini kullanarak veya tek etkinlikli bir mimari kullanırken ekran geçişlerinden sonra yapar.

Kullanıcının uygulamanız için kaydedilmiş kimlik bilgileri varsa One Tap istemcisi, başarılı dinleyiciyi arar. Başarılı dinleyicide, Task sonucundaki bekleyen niyeti alın ve One Tap ile oturum açma kullanıcı arayüzünü başlatmak için startIntentSenderForResult() cihazına iletin.

Kullanıcının kayıtlı kimlik bilgileri yoksa One Tap istemcisi hata dinleyicisini çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Sadece uygulamanın oturum açmadan kullanım deneyimini sunmaya devam edebilirsiniz. Ancak One Tap ile 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 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 olacaktır. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya kullanıcı arayüzünün dışına dokunarak oturum açmayı reddettiyse sonuç, RESULT_CANCELED koduyla gösterilir. 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ı tercih ettiyse niyet verilerini onActivityResult() uygulamasından One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek bu bilgileri alabilirsiniz. Kullanıcı, uygulamanızla bir Google Hesabı kimlik bilgisini paylaştıysa kimlik bilgisi null olmayan googleIdToken bir özelliğe, kullanıcı kayıtlı bir şifreyi paylaştıysa null olmayan password özelliğine sahip olur.

Uygulamanızın arka ucuyla kimlik doğrulamak için kimlik bilgisini kullanın.

  • Bir kullanıcı adı ve şifre çifti alındıysa, kullanıcının manuel olarak sağlamasıyla kullandığınız şekilde oturum açmak için bunları kullanın.
  • Google Hesabı kimlik bilgileri alındıysa arka ucunuzla kimlik doğrulamak için kimlik jetonunu kullanın. Tekrar 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ı kullanarak arka uçla kimlik doğrulama bölümüne bakın.

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() 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 devre dışı bırakmanız gerekir. Aşağıdaki örnekte, Etkinlik'te bir mülk ayarlayarak gerçekleştirilen bu mülk, kullanıcıya One Tap ile oturum açma olanağı sunup sunmayacağını belirler. Ancak SharedPreferences bölümüne 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})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

5. Oturum kapatma işlemini işleme

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

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

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 kimliği jetonları alabilir. Bu jetonları arka uçta nasıl kullanabileceğinizi öğrenin.

Google ile Oturum Açma'yı destekliyorsanız uygulamanıza sorunsuz hesap oluşturma akışları eklemek için One Tap istemcisini de kullanabilirsiniz.