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

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

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

Kimlik bilgileri başarıyla alındığında, bunları kullanıcının uygulamanızda sorunsuz bir şekilde oturum açması için kullanabilirsiniz.

Kullanıcı, herhangi bir kimlik bilgisi kaydetmediyse herhangi bir kullanıcı arayüzü sunulmaz ve normal oturum kapalıyken yaşamış olabileceğiniz deneyimi sunabilirsiniz.

One Tap ile oturum açma özelliğini nerelerde 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. Bu özellik, halihazırda "Google ile oturum aç" düğmeniz olsa bile 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, en son nasıl oturum açtıkları çok seyrek oturum açan kullanıcılar için hatırlatıcı oluşturabilir ve bu kullanıcıların uygulamanızla yanlışlıkla yeni hesap oluşturmasını önleyebilir.

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

İsteğe bağlı oturum açma uygulamaları, yukarıda belirtilen nedenlerden dolayı, oturum açma ekranlarında One Tap ile oturum açma özelliğini de 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ı şifreleri, kayıtlı Google Hesapları veya her biriyle oturum açacakları ş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 özelliklerini etkinleştirmek üzere 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 kimliği jetonu isteklerini etkinleştirmek ve yapılandırmak için setGoogleIdTokenRequestOptions() öğesini 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 yetki verilen 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, 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çmalarına yardımcı olabilir ve kullanıcıların uygulamanızla yanlışlıkla yeni hesaplar oluşturmalarını önler.

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

    • Kullanıcının, uygulamanız için kaydedilmiş tam olarak bir kimlik bilgisi, yani kayıtlı bir şifre veya kayıtlı bir Google Hesabı vardır.
    • Kullanıcının otomatik oturum açmayı Google Hesabı ayarlarında devre dışı bırakmamış olması gerekir.
  • İsteğe bağlı olsa da oturum açma güvenliğini artırmak ve tekrar oynatma saldırılarından kaçınmak için tek seferlik rastgele sayı kullanmanızı kesinlikle öneririz. Her isteğe bir tek seferlik rastgele sayı eklemek için setNonce kullanın. Tek seferlik 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 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 de görmek için istemi kapatın veya formun dışına dokunun. Bu, Etkinliğinizin boole özelliği kadar basit olabilir. (Aşağıdaki One Tap kullanıcı arayüzünü görüntülemeyi durdurma konusuna bakın.)

3. One Tap ile oturum açma kullanıcı arayüzünü göster

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

Kullanıcının, uygulamanız için kaydedilmiş kimlik bilgilerine sahip olması durumunda One Tap istemcisi, başarı dinleyicisini çağırır. Başarı dinleyicisinde, Task sonucundan bekleyen niyeti alın ve One Tap ile oturum açma kullanıcı arayüzünü başlatmak için bunu startIntentSenderForResult() adlı kullanıcıya iletin.

Kullanıcının kayıtlı kimlik bilgileri yoksa One Tap istemcisi hata işleyiciyi çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulama oturumunuz kapalıyken 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 hesap 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çerse sonuç, kayıtlı bir kimlik bilgisi olur. 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 döndürülür. Uygulamanız her iki olasılığı da ele almalıdır.

Alınan kimlik bilgileriyle oturum açma

Kullanıcı, kimlik bilgilerini uygulamanızla paylaşmayı seçtiyse niyet verilerini onActivityResult() uygulamasından One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek bu bilgileri alabilirsiniz. Kullanıcı, uygulamanızla bir Google Hesabı kimlik bilgisi paylaştıysa kimlik bilgisi boş olmayan bir googleIdToken özelliğine, kullanıcı kayıtlı bir şifreyi paylaştıysa boş olmayan bir 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 bunları, kullanıcının manuel olarak sağlaması durumunda kullanacağınız şekilde oturum açmak için kullanın.
  • Google Hesabı kimlik bilgileri alındıysa arka ucunuzla kimlik doğrulamak için kimlik jetonunu kullanın. Tekrar 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ıda, CommonStatusCodes.CANCELED durum kodunu içeren bir ApiException döndürülür. 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 bu işlem, kullanıcıya One Tap ile oturum açma olanağı sunup sunmayacağını belirlemek için kullanılan Etkinlik'te bir özellik ayarlayarak gerçekleştirilir. 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ırlandırmanızı uygulamanız önemlidir. Aksi takdirde, bir kullanıcı arka arkaya birkaç istemi iptal ederse One Tap istemcisi sonraki 24 saat boyunca kullanıcıya sormaz.

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 işlemini yönet

Bir kullanıcı uygulamanızda oturumu kapattığında One Tap istemcisinin signOut() yöntemini çağırın. signOut() çağrılı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, kullanıcılar uygulamanızdan çıkış yaptığı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ını 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.