Tek dokunuşla yeni hesaplar oluşturun

Google Hesapları ile oturum açmayı destekliyorsanız kullanıcılarınıza uygulamanızın bağlamından çıkmalarını gerektirmeyen sorunsuz bir hesap oluşturma deneyimi sunmak için One Tap oturum açma istemcisini kullanabilirsiniz.

One Tap ile kaydolma kullanıcı arayüzü

One Tap kullanıcı arayüzünü görüntülediğinizde kullanıcılardan cihazlarındaki Google Hesaplarından birini kullanarak uygulamanızla yeni bir hesap oluşturmaları istenir. Kullanıcı devam etmeyi seçerse temel profil bilgilerini (ad, profil fotoğrafı ve doğrulanmış e-posta adresi) içeren bir kimlik jetonu alırsınız. Bu jetonu yeni hesabı oluşturmak için kullanabilirsiniz.

One Tap ile hesap oluşturma özelliğini uygulamak iki bölümden oluşur:

  • One Tap istemcisini uygulamanıza entegre etme (bu sayfada açıklanmaktadır). Bu işlem, One Tap ile oturum açma işlemiyle büyük ölçüde aynıdır ancak yapılandırmada bazı farklılıklar vardır.
  • Arka uçunuza, Google kimlik jetonlarından kullanıcı hesabı oluşturma özelliğini ekleyin. Bu özellik Arka uçta kimlik jetonlarını kullanma başlıklı makalede ele alınmıştır.

One Tap ile kaydolma özelliğini nerede kullanmalıyım?

Kullanıcılara One Tap ile Kaydolma'yı sunmanın en etkili yolu, oturum açmanın yeni özellikleri etkinleştireceği bir bağlamdır. Öncelikle, kullanıcının kayıtlı kimlik bilgileriyle oturum açmasını deneyin. Kayıtlı kimlik bilgisi yoksa kullanıcı için yeni bir hesap oluşturmayı teklif edin.

Başlamadan önce

Google API Konsolu projenizi ve Android projenizi Tek Tıklama ile Oturum Açma'yı kullanmaya başlama bölümünde açıklandığı şekilde ayarlayın.

1. One Tap istemcisini yapılandırma

Hesap oluşturma için One Tap istemcisini yapılandırmak üzere aşağıdakileri yapın:

  • Şifre kimlik bilgisi isteklerini etkinleştirmeyin. (One Tap ile kaydolma yalnızca jeton tabanlı kimlik doğrulamasıyla mümkündür.)
  • setGoogleIdTokenRequestOptions() ve aşağıdaki ayarları kullanarak Google kimlik jetonu isteklerini etkinleştirin:

Java

public class YourActivity extends AppCompatActivity {

  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signUpRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signUpRequest = BeginSignInRequest.builder()
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.your_web_client_id))
                      // Show all accounts on the device.
                      .setFilterByAuthorizedAccounts(false)
                      .build())
              .build();

      // ...
  }
}

Kotlin

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signUpRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        // ...
    }
    // ...
}

2. One Tap kullanıcı arayüzünün iptal durumunu takip etme

İsteminizi kapatarak veya dışındaki bir yere dokunarak kullanıcının One Tap ile kaydolmayı reddedip reddetmediğini takip etmeniz gerekir. Bu, etkinliğinizin Boole mülkü kadar basit olabilir. (Aşağıdaki Tek Dokunuş kullanıcı arayüzünü göstermeyi durdurma bölümüne bakın.)

3. One Tap ile kaydolma kullanıcı arayüzünü görüntüleme

Kullanıcı, yeni hesap oluşturmak için Tek Dokunuş'u kullanmayı reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task değerine dinleyiciler ekleyin. Uygulamalar genellikle bu adımı, One Tap oturum açma isteği kayıtlı kimlik bilgisi bulamadığında, yani oturum açma isteğinin başarısızlık dinleyicisinde gerçekleştirir.

Kullanıcının cihazda ayarlanmış bir veya daha fazla Google Hesabı varsa One Tap istemcisi başarı dinleyicisini çağırır. Başarı dinleyicisinde, bekleyen intent'i Task sonucundan alın ve Tek Dokunuş kullanıcı arayüzünü başlatmak için startIntentSenderForResult()'a iletin.

Kullanıcının cihazında Google Hesabı 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. Kullanıcı, normal hesap oluşturma akışınızla kaydolabilir.

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 Google Accounts found. Just continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

Kotlin

oneTapClient.beginSignIn(signUpRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No Google Accounts found. Just 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 Kaydolma istemiyle ilgili yanıtı, Etkinlik'inizin onActivityResult() yöntemi kullanılarak uygulamanıza bildirilir. Kullanıcı hesap oluşturmayı seçtiyse sonuç bir Google kimlik jetonu olur. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya dışında bir yere dokunarak kaydolmayı reddederse sonuç RESULT_CANCELED koduyla döndürülür. Uygulamanızın her iki olasılığı da ele alması gerekir.

Google kimlik jetonu ile hesap oluşturma

Kullanıcı bir Google Hesabı ile kaydolmayı seçtiyse onActivityResult()'teki intent verilerini One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek kullanıcı için bir kimlik jetonu alabilirsiniz. Kimlik bilgisinde, null olmayan bir googleIdToken mülkü bulunur.

Kimlik jetonunu kullanarak arka uçta hesap oluşturun (Kimlik jetonlarını kullanarak arka uçta kimlik doğrulama başlıklı makaleyi inceleyin) ve kullanıcının oturumunu açın.

Kimlik bilgisi, istediğiniz ek bilgileri de içerir (ör. varsa hesabın doğrulanmış telefon numarası).

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();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  }
              } 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
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token!")
                        }
                    }
                } 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 göstermeyi durdurmanız gerekir. Aşağıdaki örnekte, kullanıcıya Tek Dokunuş ile oturum açma özelliğinin sunulup sunulmayacağını belirlemek için Etkinlik'te bir özellik ayarlanarak bu işlem gerçekleştirilmektedir. Bununla birlikte, SharedPreferences değerine 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})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

Sonraki adımlar

Bir kullanıcı Tek Dokunuş ile kaydolma akışını tamamladığında, bazı temel profil bilgilerini (kullanıcı e-posta adresi, tam ad ve profil resmi URL'si) içeren bir Google kimliği jetonu alırsınız. Birçok uygulamada bu bilgiler, arka uçta kullanıcının kimliğini doğrulamak ve yeni bir hesap oluşturmak için yeterlidir.

Hesap oluşturma işlemini tamamlamak için ek bilgilere (ör. kullanıcının doğum tarihi) ihtiyacınız varsa kullanıcıya bu ek bilgileri istediğiniz bir kayıt ayrıntıları akışı gösterin. Ardından, hesap oluşturma işlemini tamamlamak için bu bilgileri arka uç sunucunuza gönderin.