Tek dokunuşla yeni hesaplar oluşturun

Google Hesaplarıyla oturum açmayı destekliyorsanız, kullanıcılarınıza uygulamanızın bağlamını dışına çıkarmayacak sorunsuz bir hesap oluşturma deneyimi sunmak için One Tap oturum açma istemcisini kullanabilirsiniz.

Tek dokunuşla 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 (kullanıcının adı, profil fotoğrafı ve doğrulanmış e-posta adresi) içeren bir kimlik jetonu alırsınız. Bunları yeni hesap oluşturmak için kullanabilirsiniz.

One Tap hesap oluşturma işleminin iki aşaması vardır:

  • One Tap istemcisini uygulamanıza entegre etme (bu sayfada açıklanmaktadır). Bu, çoğunlukla One Tap ile oturum açmanın kullanımıyla aynıdır ancak yapılandırmada bazı farklılıklar vardır.
  • Arka ucunuza, Google kimlik jetonlarından kullanıcı hesapları oluşturma olanağı ekleme. Bu konu, Arka uçta kimlik jetonlarını kullanma bölümünde ele alınmıştır.

One Tap ile kaydolmayı nerede kullanmalıyım?

Kullanıcılara One Tap ile kaydolma seçeneği sunmak için en etkili yer, oturum açmanın yeni özellikleri etkinleştireceği bir bağlamdır. Önce, kayıtlı bir kimlik bilgisi ile kullanıcının oturumunu açmayı deneyin. Kayıtlı kimlik bilgisi bulunamazsa kullanıcı için yeni bir hesap oluşturmayı teklif edin.

Başlamadan önce

Google API'leri konsol projenizi ve Android projenizi One Tap ile oturum açmaya başlama bölümünde açıklandığı şekilde oluşturun.

1. One Tap istemcisini yapılandırma

One Tap istemcisini hesap oluşturma işlemi 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() özelliğini ve şu 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. One Tap kullanıcı arayüzü iptallerini takip edin

Kullanıcının One Tap ile kaydolmayı kullanmayı reddedip reddetmediğini görmek için istemi kapatın veya seçeneğin dışına dokunun. Bu, Etkinliğinizin bir boole özelliği kadar basit olabilir. (Aşağıdaki One Tap kullanıcı arayüzünün gösterilmesini durdurma bölümüne bakın.)

3. One Tap ile kaydolma kullanıcı arayüzünü göster

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

Kullanıcının cihazında bir veya daha fazla Google Hesabı ayarlanmışsa One Tap istemcisi, başarılı dinleyiciyi arar. Başarı işleyicide, Task sonucundan beklemedeki niyeti alın ve One Tap kullanıcı arayüzünü başlatmak için startIntentSenderForResult() öğesine iletin.

Kullanıcının cihazda Google Hesabı yoksa One Tap istemcisi hata dinleyicisini arar. Bu durumda herhangi bir işlem yapmanız gerekmez. Uygulama oturumu kapalıyken uygulamayı sunmaya devam edebilirsiniz ve kullanıcı normal hesap oluşturma akışınıza 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 raporlanır. Kullanıcı hesap oluşturmayı seçtiyse sonuç bir Google kimliği jetonu olur. Kullanıcı, One Tap kullanıcı arayüzünü kapatarak veya kullanıcı arayüzünün dışına dokunarak kaydolmayı reddettiyse sonuç, RESULT_CANCELED kodunu döndürecektir. Uygulamanızın her iki olasılığı da işlemesi gerekir.

Google kimlik jetonuyla hesap oluşturma

Kullanıcı bir Google Hesabı ile kaydolmayı tercih ettiyse amaç verilerini onActivityResult() ürününden 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 bir hesap oluşturmak için kimlik jetonunu kullanın (bkz. Kimlik jetonları kullanarak arka uçla kimlik doğrulama) ve kullanıcının oturumunu açın.

Kimlik bilgisi, varsa hesabın doğrulanmış telefon numarası gibi istediğiniz ek ayrıntıları da içerir.

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ı reddederse getSignInCredentialFromIntent() numaralı telefona yapılan çağrı, CommonStatusCodes.CANCELED durum kodunu içeren bir ApiException hatası verir. 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 durdurmanız gerekir. Aşağıdaki örnekte bunun için, Etkinlik'te bir mülk ayarlayarak kullanıcıya One Tap ile oturum açma izni verilip verilmeyeceğini belirleyebilirsiniz. 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ırlamanızı uygulamanız önemlidir. Aksi takdirde kullanıcı art arda birkaç istemi iptal ederse One Tap istemcisi sonraki 24 saat boyunca kullanıcıdan onay ister.

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 kayıt akışını tamamladığında bir Google kimlik jetonu alırsınız. Bu jeton bazı temel profil bilgilerini içerir: kullanıcının e-posta adresi, tam adı ve profil resmi URL'si. Çoğu uygulamada bu bilgiler arka uçta kullanıcının kimliğini doğrulamanız ve yeni bir hesap oluşturmanız için yeterlidir.

Hesap oluşturma işlemini tamamlamak için ek bilgiye (ör. kullanıcının doğum tarihi) ihtiyaç duyuyorsanız, kullanıcıya kayıt ayrıntıları akışını sunarak bu ek bilgileri talep edin. Ardından hesap oluşturma işlemini tamamlamak için bu bilgileri arka ucunuza gönderin.