Tek dokunuşla yeni hesaplar oluşturun

Google Hesapları ile oturum açmayı destekliyorsanız One Tap oturum açma istemcisini kullanarak kullanıcılarınıza uygulamanızın bağlamından hiç çıkmadan sorunsuz bir hesap oluşturma deneyimi sunabilirsiniz.

Tek dokunuşla kaydolma kullanıcı arayüzü

Tek Dokunuş kullanıcı arayüzünü gösterdiğinizde kullanıcılardan, cihazlarındaki Google Hesaplarından birini kullanarak uygulamanızda 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 kullanarak yeni hesabı oluşturabilirsiniz.

Tek Dokunuşla hesap oluşturma özelliğini uygulamak iki bölümden oluşur:

  • Tek Dokunuş istemcisini uygulamanıza entegre etme (bu sayfada açıklanmıştır). Bu, büyük ölçüde One Tap ile oturum açma özelliğini kullanmakla aynıdır ancak yapılandırmada bazı farklılıklar vardır.
  • Arka ucunuza Google kimlik jetonlarından kullanıcı hesapları oluşturma özelliğini ekleme. Bu konu, Arka uçta kimlik jetonlarını kullanma bölümünde ele alınmıştır.

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

Kullanıcılara One Tap ile kaydolma seçeneğini sunmak için en etkili yer, oturum açmanın yeni özelliklere erişim sağlayacağı bir bağlamdır. Öncelikle kullanıcının kayıtlı bir kimlik bilgisiyle oturum açmasını dener. Kayıtlı kimlik bilgisi bulunamazsa kullanıcı için yeni hesap oluşturmayı teklif edin.

Başlamadan önce

Google Cloud Console projenizi ve Android projenizi One Tap ile oturum açma özelliğini kullanmaya başlama bölümünde açıklandığı şekilde ayarlayın.

1. Tek Dokunuş istemcisini yapılandırma

Tek Dokunuş istemcisini hesap oluşturma için yapılandırmak üzere aşağıdakileri yapın:

  • Şifre kimlik bilgisi isteklerini etkinleştirmeyin. (Tek dokunuşla kaydolma yalnızca jeton tabanlı kimlik doğrulamayla mümkündür.)
  • setGoogleIdTokenRequestOptions() ve aşağıdaki ayarları kullanarak Google kimliği 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. Tek Dokunuş kullanıcı arayüzü iptalini takip etme

Kullanıcının, istemi kapatarak veya istemin dışına dokunarak Tek Dokunuşla kaydolma özelliğini kullanmayı reddedip reddetmediğini takip etmeniz gerekir. Örneğin, etkinliğinizin boole özelliğini kullanabilirsiniz. (Aşağıdaki One Tap 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österme

Kullanıcı, yeni bir hesap oluşturmak için Tek Dokunuş'u kullanmayı reddetmediyse istemci nesnesinin beginSignIn() yöntemini çağırın ve döndürdüğü Task öğesine dinleyiciler ekleyin. Uygulamalar genellikle bu adımı, One Tap ile oturum açma isteği kayıtlı kimlik bilgisi bulamadığında (yani oturum açma isteğinin hata işleyicisinde) uygular:

  • Başarılı dinleyici: Kullanıcının cihazda ayarlanmış bir veya daha fazla Google Hesabı varsa One Tap istemcisi başarılı dinleyiciyi çağırır. Başarılı dinleyicide, Task sonucundan beklemede olan intent'i alın ve One Tap kullanıcı arayüzünü başlatmak için startIntentSenderForResult() yöntemine iletin.
  • Hata dinleyici: Kullanıcının cihazda Google Hesabı yoksa One Tap istemcisi hata dinleyiciyi çağırır. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulamanın oturum açılmamış deneyimini sunmaya devam edin. 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 One Tap ile kaydolma istemine verdiği yanıt, etkinliğ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 arayüzün dışına dokunarak kaydolmayı reddettiyse sonuç RESULT_CANCELED koduyla döndürülür. Uygulamanızın her iki olasılığı da işlemesi gerekir.

Google kimlik jetonuyla hesap oluşturma

Kullanıcı bir Google Hesabı ile kaydolmayı seçtiyse onActivityResult() öğesinden intent verilerini One Tap istemcisinin getSignInCredentialFromIntent() yöntemine ileterek kullanıcı için bir kimlik jetonu alabilirsiniz. Kimlik bilgisi, boş olmayan bir googleIdToken özelliğine sahip olur.

Arka ucunuzda hesap oluşturmak için kimlik jetonunu kullanın (Kimlik jetonlarını kullanarak arka uçta kimlik doğrulama bölümüne bakın) ve kullanıcının oturum açmasını sağlayın.

Kimlik bilgisi, istediğiniz diğer ayrıntıları da içerir (ör. 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) {
                      // ...
              }
          }
      }
      // ...
  }

Tek Dokunuş kullanıcı arayüzünün gösterilmesini durdurma

Kullanıcı oturum açmayı reddettiyse getSignInCredentialFromIntent() çağrısı, CommonStatusCodes.CANCELED durum koduna sahip bir ApiException hatası verir. Bu durumda, kullanıcılarınızı tekrar eden istemlerle rahatsız etmemek için One Tap ile oturum açma kullanıcı arayüzünü göstermeyi geçici olarak durdurmanız gerekir. Aşağıdaki örnekte, Etkinlik'te bir özellik ayarlanarak bu işlem gerçekleştirilir. Bu özellik, kullanıcıya Tek Dokunuşla oturum açma seçeneği sunulup sunulmayacağını belirlemek için kullanılır. Ancak, SharedPreferences değerine bir değer de kaydedebilir veya başka bir yöntem kullanabilirsiniz.

One Tap ile oturum açma istemleri için kendi sıklık sınırlamanızı uygulamanız önemlidir. Bunu yapmazsanız ve bir kullanıcı arka arkaya birkaç istemi iptal ederse One Tap istemcisi, sonraki 24 saat boyunca kullanıcıdan istemde bulunmaz.

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

Kullanıcı, One Tap ile kaydolma akışını tamamladığında bazı temel profil bilgilerini (kullanıcının e-posta adresi, tam adı ve profil resmi URL'si) içeren bir Google kimlik jetonu alırsınız. Birçok uygulama için bu bilgiler, kullanıcının arka uçta kimliğini doğrulamanız ve yeni bir hesap oluşturmanız 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ışı sunun. Ardından, hesap oluşturma işlemini tamamlamak için bu bilgileri arka ucunuza gönderin.