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

Kullanıcıdan, daha önce uygulamanızda oturum açmak için 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 Akıllı Kilit'i kullanarak Google'a kaydettikleri bir Google Hesabı ya da kullanıcı adı-şifre kombinasyonu olabilir.

One Tap ile oturum açma kullanıcı arayüzü

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

Kullanıcı herhangi bir kimlik bilgisi kaydetmediyse kullanıcı arayüzü gösterilmez ve oturumu kapalı olan kullanıcılara normal deneyiminizi sunabilirsiniz.

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 Tek Dokunuş 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ü, kullanıcının daha önce oturum açmak için kullandığı kimlik bilgilerini göstermek üzere yapılandırılabilir. Bu sayede, nadiren oturum açan kullanıcılar son oturum açma şeklini hatırlayabilir ve uygulamanızla yanlışlıkla yeni hesap oluşturabilir.

Uygulamanız için oturum açma isteğe bağlıysa oturum açarak geliştirilmiş bir deneyim sunan tüm ekranlarda One Tap ile oturum açma özelliğini kullanabilirsiniz. Örneğin, kullanıcılar oturumları kapalıyken uygulamanızla içeriğe göz atabilir ancak yalnızca oturum açtıktan sonra yorum yayınlayabilir veya alışveriş sepetine ürün ekleyebilirse bu, Tek Dokunuşla oturum açma için uygun bir bağlamdır.

Oturum açma işlemi isteğe bağlı olan uygulamalar, yukarıda belirtilen nedenlerden dolayı oturum açma ekranlarında da 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

One Tap ile oturum açma istemcisini, kullanıcıların kayıtlı şifreleriyle, kayıtlı Google Hesaplarıyla veya her ikisiyle oturum açması için 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 amacıyla her ikisini de desteklemeniz önerilir.)

Uygulamanız şifreye dayalı oturum açma özelliğini kullanıyorsa şifre kimlik bilgisi isteklerini etkinleştirmek için setPasswordRequestOptions() seçeneğini 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() öğesini kullanın:

  • Sunucu istemci kimliğini Google API'ler Konsolu'nda oluşturduğunuz kimliğe ayarlayın. Bunun Android istemci kimliğiniz değil, sunucunuzun istemci kimliği olduğunu unutmayın.

  • İstemciyi, 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 daha önce kullandıkları Google Hesaplarıyla uygulamanızda oturum açmalarını ister. Bu, kullanıcıların daha önce hesapları olup olmadığından veya hangi Google Hesabını kullandıklarından emin olmadıklarında başarılı bir şekilde oturum açmasına yardımcı olabilir ve kullanıcıların uygulamanızla yanlışlıkla yeni hesap oluşturmasını önler.

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

    • Kullanıcının uygulamanız için kayıtlı tam olarak bir kimlik bilgisi olmalıdır. Yani kayıtlı bir şifre veya kayıtlı 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 tek seferlik bir sayı kullanmanızı önemle tavsiye ederiz. Her isteğe tek seferlik bir sayı eklemek için setNonce işlevini kullanın. Tek seferlik şifre oluşturmayla ilgili öneriler ve ek ayrıntılar için SafetyNet'in Tek seferlik şifre edinme 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 kapalı 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.

Ayrıca, kullanıcının istemi kapatarak veya dışında bir yere dokunarak Tek Dokunuş ile oturum açma özelliğini reddedip reddetmediğini de izlemeniz gerekir. Bu, etkinliğinizin Boole mülkü 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 Tek Dokunuş ile oturum açma özelliğini reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task değerine dinleyiciler ekleyin. Uygulamalar bunu genellikle etkinliğin onCreate() yönteminde veya tek etkinlikli bir mimari kullanıldığında ekran geçişlerinden sonra yapar.

Kullanıcının uygulamanız için kayıtlı kimlik bilgileri varsa One Tap istemcisi, başarı dinleyicisini çağırır. Başarı dinleyicisinde, One Tap oturum açma kullanıcı arayüzünü başlatmak için Task sonucundan bekleyen intent'i alıp startIntentSenderForResult()'e iletin.

Kullanıcının kayıtlı kimlik bilgileri yoksa One Tap istemcisi, hata dinleyiciyi çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulamanın oturum kapalı deneyimini sunmaya devam edebilirsiniz. Ancak tek dokunuşla 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 Tek Dokunuşla oturum açma istemiyle verdiği yanıt, Etkinlik'inizin onActivityResult() yöntemi kullanılarak uygulamanıza bildirilir. Kullanıcı oturum açmayı seçtiyse sonuçta kayıtlı bir kimlik bilgisi elde edilir. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya dışında bir yere dokunarak oturum açmayı reddederse sonuç RESULT_CANCELED koduyla 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 intent verilerini onActivityResult()'ten One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek bu bilgileri alabilirsiniz. Kullanıcı uygulamanızla bir Google Hesabı kimlik bilgisi paylaştıysa kimlik bilgisinde null olmayan bir googleIdToken mülkü, kullanıcı kayıtlı bir şifre paylaştıysa null olmayan bir password mülkü bulunur.

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ı bunları manuel olarak sağlamış gibi oturum açmak için kullanın.
  • Google Hesabı kimlik bilgileri alındıysa arka uçunuzla kimlik doğrulama yapmak için kimlik jetonunu kullanın. Tekrar oynatma saldırılarını önlemek için tek seferlik bir değer 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) {
                    // ...
                }
            }
        }
    }
    // ...
}

One Tap kullanıcı arayüzünü göstermeyi durdurma

Kullanıcı oturum açmayı reddettiyse getSignInCredentialFromIntent() çağrısı, CommonStatusCodes.CANCELED durum koduyla bir ApiException oluşturur. Bu durumda, kullanıcılarınızı tekrarlanan istemlerle 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, kullanıcıya Tek Dokunuş ile oturum açma özelliğini sunup sunmayacağını belirlemek için etkinlikte bir özellik ayarlanarak bu işlem gerçekleştirilmektedir. Bununla birlikte, SharedPreferences özelliğine bir değer kaydedebilir veya başka bir yöntem kullanabilirsiniz.

One Tap ile oturum açma istemleri için kendi hız sınırlamanızı uygulamanız önemlidir. Bunu yapmazsanız ve bir kullanıcı arka arkaya birkaç istemi iptal ederse One Tap istemcisi, kullanıcıya sonraki 24 saat boyunca 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ızdan çıktığında One Tap istemcisinin signOut() yöntemini çağırın. signOut() çağrısı, kullanıcı yeniden oturum açana kadar otomatik oturum açma özelliğini devre dışı bırakır.

Otomatik oturum açma özelliğini kullanmıyor olsanız bile bu adım önemlidir. Kullanıcılar uygulamanızdan çıktığı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ı alabilir. Bu jetonları arka uçta nasıl kullanabileceğinizi öğrenin.

Google ile oturum açma özelliğini destekliyorsanız uygulamanıza sorunsuz hesap oluşturma akışları eklemek için One Tap istemcisini de kullanabilirsiniz.