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

One Tap ile oturum açma istemcisini kullanarak kullanıcıdan veri alma izni isteyin Uygulamanızda daha önce oturum açmak için kullandıkları kimlik bilgilerinden birini kullanıyor. Bu kimlik bilgileri bir Google Hesabı veya kullanıcı adı-şifre kombinasyonu olabilir Chrome, Android otomatik doldurma veya Smart Lock kullanarak Google'da kaydettikleri Şifreler.

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

Kimlik bilgileri başarıyla alındıktan sonra sorunsuz bir şekilde bunları kullanabilirsiniz. kullanıcının uygulamanızda oturum açmasını sağlayın.

Kullanıcı herhangi bir kimlik bilgisi kaydetmemişse kullanıcı arayüzü gösterilmez ve şunları yapabilirsiniz: normal oturum açma deneyiminizi nasıl kullanacağınızı göstereceğim.

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 sırasında One Tap kullanıcı arayüzünü gösterin tıklayın. Bu özellik, halihazırda "Google ile oturum aç" özelliğini etkinleştirmiş olsanız bile yararlı olabilir düğmesi: One Tap kullanıcı arayüzü, yalnızca bir not veya not: Bu, seyrek olarak oturum açan kullanıcılara, oturum açma yöntemini kullanarak oturum açmalarını ve yanlışlıkla oturum açmalarını önlemek için ve uygulamanızla yeni hesaplar oluşturabilirsiniz.

Uygulamanızda oturum açma isteğe bağlıysa oturum açarak iyileştirilmiş bir deneyim sunan yeni bir ekran seçin. Örneğin, kullanıcılar oturumunuz kapalıyken uygulamanızla içeriklere göz atabilirsiniz ancak yalnızca yorum yayınlayabilir veya içerik ekleyebilir alışveriş sepetine ürün ekledikten sonra, bu, oturum açma One Tap ile oturum açma.

İsteğe bağlı oturum açma uygulamalarının oturum açma ekranlarında One Tap ile oturum açma özelliğini de kullanması gerekir. (yukarıda belirtilen nedenlerden dolayı) kabul edilir.

Başlamadan önce

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

One Tap ile oturum açma istemcisini, kayıtlı e-posta adresleriyle kullanıcıların oturum açmasını sağlayacak şekilde yapılandırabilirsiniz. veya kayıtlı Google Hesapları gibi (Böylece projede her ikisinin de desteklenmesi önerilir. yeni kullanıcılar için tek dokunuşla hesap oluşturma ve otomatik ya da tek dokunuşla oturum açmayı etkinleştir olabildiğince çok sayıda geri gelen kullanıcı için)

Uygulamanızda şifre tabanlı oturum açma kullanılıyorsa şunları yapmak için setPasswordRequestOptions() kullanın: Şifre kimlik bilgisi isteklerini etkinleştirme.

Uygulamanız Google ile Oturum Açma özelliğini kullanıyorsa setGoogleIdTokenRequestOptions() ile oturum açma Google kimliği jeton isteklerini etkinleştirin ve yapılandırın:

  • Sunucu istemci kimliğini, Google API'lerinde oluşturduğunuz kimlik olarak ayarlayın. konsolu hakkında daha fazla bilgi edinin. Bunun, sunucunuzun istemci kimliğidir. Android istemci kimliğiniz.

  • İstemciyi yetkili hesaplara göre filtreleyecek şekilde yapılandırın. Bunu etkinleştirdiğinizde seçeneğinde, One Tap istemcisi, kullanıcılardan uygulamanızda yalnızca Geçmişte kullanmış oldukları Google Hesapları. Bu sayede kullanıcılar bir hesapları olup olmadığından emin olmadıklarında veya hangi ve kullanıcıların yanlışlıkla yeni hesap oluşturmalarını önlemek için kullandıkları daha fazla bilgi edineceksiniz.

  • Mümkün olduğunda kullanıcıların otomatik olarak oturum açmasını istiyorsanız özelliği etkinleştirin setAutoSelectEnabled() ile birlikte. Otomatik oturum açma şu durumlarda kullanılabilir: karşılandığına dikkat edin:

    • Kullanıcının uygulamanız için kayıtlı tam olarak bir kimlik bilgisi vardır. Kaydedilen bir şifrenizi veya kayıtlı bir Google Hesabı'nı kullanabilirsiniz.
    • Kullanıcı, hesabında otomatik oturum açmayı devre dışı bırakmamış olabilir Google Hesabı ayarları.
  • İsteğe bağlı olsa da, tek seferlik rastgele sayı veya oturum açma güvenliğini artırır ve tekrar saldırılarını önler. Tekliflerinizi otomatikleştirmek ve optimize etmek için setNonce eklemesi gerekir. SafetyNet'in sayfalarına göz atın Tek seferlik rastgele sayı 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 edin

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

Kullanıcının uygulamayı kullanmayı reddedip reddetmediğini de takip etmeniz gerekir. One Tap ile, istemi kapatarak veya dışına dokunarak oturum açabilirsiniz. Bu kadar basit bir boole özelliği 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çmayı kullanmayı reddetmemişse: istemci nesnesinin beginSignIn() yöntemini çağırın ve Task değerini döndürür. Uygulamalar genellikle bunu Etkinlik'in onCreate() yönteminde yapar ekran geçişlerinden sonra nasıl uygulanacağını ele alacağız.

One Tap istemcisi, kullanıcının kaydedilmiş herhangi bir öğe varsa başarılı dinleyiciyi arar kimlik bilgisidir. Başarı dinleyicisinde, beklemedeki niyeti Task sonucunu alıp startIntentSenderForResult() adlı kullanıcıya ileterek One Tap ile oturum açma kullanıcı arayüzü.

Kullanıcının kayıtlı bir kimlik bilgisi yoksa One Tap istemcisi yardımcı olur. Bu durumda herhangi bir işlem yapmanız gerekmez, dilerseniz devam edebilirsiniz Uygulamada oturum açılmadan önce gösterilen deneyimi sunmak. Ancak One Tap'i destekliyorsanız sorunsuz bir hesap oluşturma süreci için bu akışı sahip olacaksınız. 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 uygulamanıza bildirilir Etkinliğinizin onActivityResult() yöntemini kullanarak. Kullanıcı oturum açmayı seçerse sonuç, kayıtlı bir kimlik bilgisi olacaktır. Kullanıcı oturum açmayı reddettiyse: One Tap kullanıcı arayüzünü kapattığınızda veya dışına dokunduğunuzda sonuç, kod RESULT_CANCELED. Uygulamanızın her iki olasılığı da karşılaması gerekir.

Alınan kimlik bilgileriyle oturum açma

Kullanıcı, kimlik bilgilerini uygulamanızla paylaşmayı seçtiyse şu şekilde alabilirsiniz: Amaç verilerini onActivityResult() kaynağından One Tap istemcisinin hesabına iletme getSignInCredentialFromIntent() yöntemini çağırın. Kimlik bilgisinde boş değerli olmayan bir değer olacaktır Kullanıcı bir Google Hesabı kimlik bilgisini şununla paylaştıysa googleIdToken mülkü: uygulamanıza veya kullanıcı kayıtlı bir şifre paylaştıysa boş değerli olmayan bir password özelliğine dokunun.

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

  • Kullanıcı adı ve şifre çifti alındıysa aynı hesapla oturum açmak için bunları kullanın. kullanıcı tarafından manuel olarak sağlanması gerektiği gibi.
  • Google Hesabı kimlik bilgileri alındıysa kimlik doğrulamak için kimlik jetonunu kullanın test edebilirsiniz. Tekrar oynatmayı önlemek için tek seferlik rastgele sayı kullanmayı seçtiyseniz arka uç sunucunuzdaki yanıt değerini kontrol eder. Görüntüleyin Kimlik jetonlarını kullanarak arka uçla kimlik doğrulayı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ı reddetmişse getSignInCredentialFromIntent() çağrısı CommonStatusCodes.CANCELED durum koduna sahip bir ApiException atar. Bu durumda One Tap ile oturum açma kullanıcı arayüzünü geçici olarak devre dışı bırakmanız gerekir. tekrar eden istemlerle kullanıcılarınızı rahatsız etmeyin. Aşağıdaki örnekte, bunu, Etkinlik üzerinde bir özellik ayarlayarak kullanıcıya One Tap ile oturum açma olanağı sunma; ancak aynı zamanda SharedPreferences veya başka bir yöntem kullanın.

One Tap ile oturum açma istemlerinde kendi hız sınırlamanızı uygulamanız önemlidir. Bunu yapmazsanız ve kullanıcı art arda birkaç istemi iptal ederse One Tap istemcisi , kullanıcıyı 24 saat boyunca istemez.

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 gerçekleştirme

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çmayı kullanmıyor olsanız bile, bu adım önemlidir Kullanıcılar uygulamanızda oturum kapattığında, cihazdaki herhangi bir Kullandığınız Play hizmetleri API'leri de sıfırlanır.

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 kimliğini temsil eden Google kimliği jetonları alabilir Google Hesapları. Öğren bu jetonları arka uçta nasıl kullanabileceğinizi öğrenin.

Google ile Oturum Açma'yı destekliyorsanız One Tap istemcisini kullanarak sorunsuz hesap oluşturma süreci uygulamanıza.