Telefon numarası kullanarak Android'de Firebase ile kimlik doğrulama

Firebase Authentication'ı kullanarak kullanıcının telefonuna SMS mesajı göndererek kullanıcının oturumunu açabilirsiniz. Kullanıcı, SMS mesajında yer alan tek kullanımlık bir kodu kullanarak oturum açar.

Uygulamanıza telefon numarası ile oturum açma özelliği eklemenin en kolay yolu, telefon numarasıyla oturum açma için oturum açma akışlarının yanı sıra şifre tabanlı ve birleşik oturum açma özelliğini uygulayan bir açılır oturum açma widget'ı içeren FirebaseUI kullanmaktır. Bu belgede, Firebase SDK'sını kullanarak telefon numarası oturum açma akışının nasıl uygulanacağı açıklanmaktadır.

Başlamadan önce

  1. Henüz yapmadıysanız Firebase'i Android projenize ekleyin.
  2. Modül (uygulama düzeyinde) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle), Android için Firebase Authentication kitaplığına bağımlılığı ekleyin. Kitaplık sürümünü kontrol etmek için Firebase Android BoM'u kullanmanızı öneririz.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.1"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Firebase Android BoM kullanıldığında uygulamanız Firebase Android kitaplıklarının her zaman uyumlu sürümlerini kullanır.

    (Alternatif) BoM'u kullanmadan Firebase kitaplığı bağımlılıklarını ekleme

    Firebase BoM'yi kullanmamayı seçerseniz her Firebase kitaplığı sürümünü bağımlılık satırında belirtmeniz gerekir.

    Uygulamanızda birden fazla Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için BoM kullanmanızı önemle tavsiye ederiz. Böylece tüm sürümlerin uyumlu olması sağlanır.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    }
    
    Kotlin'e özel bir kitaplık modülü mü arıyorsunuz? Ekim 2023'ten (Firebase BoM 32.5.0) itibaren, hem Kotlin hem de Java geliştiricileri ana kitaplık modülüne bağlı olabilir (ayrıntılar için Bu girişimle ilgili SSS bölümüne bakın).
  3. Uygulamanızı henüz Firebase projenize bağlamadıysanız bunu Firebase konsolundan yapın.
  4. Firebase konsolunda uygulamanızın SHA-1 karmasını henüz ayarlamadıysanız bunu yapın. Uygulamanızın SHA-1 karmasını bulma hakkında bilgi edinmek için İstemcinizi Kimlik Doğrulama başlıklı makaleyi inceleyin.

Güvenlikle ilgili sorunlar

Yalnızca telefon numarası kullanarak yapılan kimlik doğrulama işlemi pratik olan diğer yöntemlere göre daha az güvenlidir. Bunun nedeni, telefon numarasına sahip olma durumunun kullanıcılar arasında kolayca aktarılmasıdır. Ayrıca, birden fazla kullanıcı profiline sahip cihazlarda SMS mesajı alabilen tüm kullanıcılar, cihazın telefon numarasını kullanarak bir hesapta oturum açabilir.

Uygulamanızda telefon numarası tabanlı oturum açma özelliğini kullanıyorsanız bu özelliği daha güvenli oturum açma yöntemleriyle birlikte sunmalı ve kullanıcıları telefon numarasıyla oturum açmanın güvenlik açısından olumsuzlukları hakkında bilgilendirmelisiniz.

Firebase projeniz için Telefon Numarasıyla oturum açmayı etkinleştirme

Kullanıcıların SMS ile oturum açmasını sağlamak için önce Firebase projenizde Telefon Numarası oturum açma yöntemini etkinleştirmeniz gerekir:

  1. Firebase konsolunda Kimlik Doğrulama bölümünü açın.
  2. Oturum Açma Yöntemi sayfasında, Telefon Numarası oturum açma yöntemini etkinleştirin.

Firebase'in telefon numarası oturum açma isteği kotası, çoğu uygulamanın etkilenmeyecek kadar yüksek. Ancak telefonla kimlik doğrulamayla çok sayıda kullanıcının oturumunu açmanız gerekiyorsa fiyatlandırma planınızı yükseltmeniz gerekebilir. Fiyatlandırma sayfasını inceleyin.

Uygulama doğrulamayı etkinleştirme

Telefon numarası ile kimlik doğrulamayı kullanmak için Firebase'in, telefon numarası oturum açma isteklerinin uygulamanızdan geldiğini doğrulayabilmesi gerekir. Firebase Authentication bunu üç şekilde yapar:

  • Play Integrity API: Kullanıcının Google Play Hizmetleri'nin yüklü olduğu bir cihazı varsa ve Firebase Authentication, Play Integrity API ile cihazın meşru olduğunu doğrulayabiliyorsa telefon numarasıyla oturum açılabilir. Play Integrity API, sizin projenizde değil, Firebase Authentication tarafından Google'a ait bir projede etkinleştirilir. Bu, projenizdeki Play Integrity API kotalarına katkıda bulunmaz. Play Integrity Desteği, Kimlik Doğrulama SDK'sı v21.2.0+ (Firebase BoM v31.4.0+) ile kullanılabilir.

    Play Integrity'yi kullanmak için uygulamanızın SHA-256 parmak izini henüz belirtmediyseniz Firebase konsolunun Proje ayarları bölümünden bunu yapın. Uygulamanızın SHA-256 parmak izini nasıl alacağınızla ilgili ayrıntılar için İstemcinizin Kimlik Doğrulaması bölümüne bakın.

  • reCAPTCHA doğrulaması: Play Integrity'nin kullanılamaması durumunda (ör. kullanıcının Google Play Hizmetleri yüklü olmayan bir cihazı olduğunda) Firebase Authentication, telefonda oturum açma akışını tamamlamak için reCAPTCHA doğrulaması kullanır. reCAPTCHA sorgulaması genellikle kullanıcının herhangi bir şey çözmesine gerek kalmadan tamamlanabilir. Bu akışın, uygulamanızla bir SHA-1'in ilişkilendirilmesini gerektirdiğini unutmayın. Bu akış, API anahtarınızın PROJECT_ID.firebaseapp.com için kısıtlanmamış veya izin verilenler listesine eklenmiş olmasını da gerektirir.

    reCAPTCHA'nın tetiklendiği bazı senaryolar:

    • Son kullanıcının cihazında Google Play Hizmetleri yüklü değilse.
    • Uygulama Google Play Store üzerinden dağıtılmıyorsa (Kimlik Doğrulama SDK'sı v21.2.0+ sürümünde).
    • Elde edilen SafetyNet jetonu geçerli değilse (Kimlik Doğrulama SDK'sı 21.2.0'dan önceki sürümlerde).

    Uygulama doğrulama için SafetyNet veya Play Integrity kullanıldığında SMS şablonundaki %APP_NAME% alanına Google Play Store'dan belirlenen uygulama adı girilir. reCAPTCHA'nın tetiklendiği senaryolarda %APP_NAME%, PROJECT_ID.firebaseapp.com olarak doldurulur.

reCAPTCHA doğrulama akışını forceRecaptchaFlowForTesting ile zorunlu kılabilirsiniz. setAppVerificationDisabledForTesting kullanarak uygulama doğrulamayı (kurmaca telefon numaraları kullanırken) devre dışı bırakabilirsiniz.

Sorun giderme

  • Uygulama doğrulaması için reCAPTCHA kullanılırken "İlk durum eksik" hatası

    Bu durum, reCAPTCHA akışı başarıyla tamamlandığında ancak kullanıcıyı tekrar yerel uygulamaya yönlendirmediğinde ortaya çıkabilir. Bu durumda kullanıcı yedek URL'ye (PROJECT_ID.firebaseapp.com/__/auth/handler) yönlendirilir. Firefox tarayıcılarda yerel uygulama bağlantılarının açılması varsayılan olarak devre dışıdır. Firefox'ta yukarıdaki hatayı görürseniz uygulama bağlantılarını açmayı etkinleştirmek için Android için Firefox'u yerel uygulamalarda bağlantıları açacak şekilde ayarlama bölümündeki adımları uygulayın.

Kullanıcının telefonuna doğrulama kodu gönderme

Telefon numarasıyla oturum açmayı başlatmak için kullanıcıya telefon numarasını yazmasını isteyen bir arayüz sunun. Yasal şartlar değişiklik gösterir, ancak en iyi uygulama olarak ve kullanıcılarınızın beklentilerini belirlemek amacıyla, telefonla oturum açmalarını kullandıkları takdirde doğrulama için bir SMS mesajı alabileceklerini ve standart ücretlerin geçerli olacağını bildirmeniz gerekir.

Ardından, Firebase'in kullanıcının telefon numarasını doğrulamasını istemek için telefon numarasını PhoneAuthProvider.verifyPhoneNumber yöntemine iletin. Örnek:

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

verifyPhoneNumber yöntemi reentrant: Bir etkinliğin onStart yönteminde olduğu gibi, birden fazla kez çağırırsanız orijinal istek zaman aşımına uğramadıkça verifyPhoneNumber yöntemi ikinci bir SMS göndermez.

Uygulamanız kullanıcı oturum açmadan kapatılırsa (örneğin, kullanıcı SMS uygulamasını kullanırken) telefon numarasıyla oturum açma işlemini devam ettirmek için bu davranışı kullanabilirsiniz. verifyPhoneNumber numaralı telefonu çağırdıktan sonra doğrulamanın devam ettiğini gösteren bir işaret ayarlayın. Ardından işareti, Etkinliğinizin onSaveInstanceState yönteminde kaydedin ve onRestoreInstanceState konumunda geri yükleyin. Son olarak, Etkinliğinizin onStart yönteminde, doğrulama işleminin devam edip etmediğini kontrol edin. Devam ediyorsa verifyPhoneNumber işlevini tekrar çağırın. Doğrulama tamamlandığında veya başarısız olduğunda işareti temizlediğinizden emin olun ( Doğrulama geri çağırmaları bölümüne bakın).

Ekran döndürme ve Etkinlik yeniden başlatma gibi diğer durumları kolayca yönetmek için Etkinliğinizi verifyPhoneNumber yöntemine iletin. Geri çağırma işlevleri Etkinlik durduğunda otomatik olarak çıkarılır. Böylece geri çağırma yöntemlerinde kullanıcı arayüzü geçiş kodunu serbestçe yazabilirsiniz.

Firebase tarafından gönderilen SMS mesajı, Auth örneğinizde setLanguageCode yöntemi aracılığıyla kimlik doğrulama dilini belirterek de yerelleştirilebilir.

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

PhoneAuthProvider.verifyPhoneNumber çağırırken isteğin sonuçlarını işleyen geri çağırma işlevlerinin uygulamalarını içeren bir OnVerificationStateChangedCallbacks örneği de sağlamanız gerekir. Örnek:

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Doğrulama geri aramaları

Çoğu uygulamada onVerificationCompleted, onVerificationFailed ve onCodeSent geri çağırmalarını uygularsınız. Uygulamanızın gereksinimlerine bağlı olarak onCodeAutoRetrievalTimeOut özelliğini de uygulayabilirsiniz.

onDoğrulamaTamamlandı(PhoneAuthCredential)

Bu yöntem iki durumda çağrılır:

  • Anında doğrulama: Bazı durumlarda telefon numarası, doğrulama kodu gönderilmesine veya girilmesine gerek kalmadan anında doğrulanabilir.
  • Otomatik alma: Bazı cihazlarda Google Play Hizmetleri, gelen doğrulama SMS'ini otomatik olarak algılayıp kullanıcı işlemi yapmadan doğrulama gerçekleştirebilir. (Bu özellik bazı operatörlerde kullanılamayabilir.) Bu, SMS mesajının sonunda 11 karakterlik bir karma içeren SMS Retriever API'yi kullanır.
Her iki durumda da kullanıcının telefon numarası başarıyla doğrulanır ve geri çağırmaya iletilen PhoneAuthCredential nesnesini kullanarak kullanıcıda oturum açabilirsiniz.

onDoğrulamaFailed(FirebaseException)

Bu yöntem, geçersiz telefon numarası veya doğrulama kodunun belirtildiği istek gibi geçersiz bir doğrulama isteğine yanıt olarak çağrılır.

onCodeSent(Dize doğrulamakimliği, PhoneAuthProvider.ForceResendingToken)

İsteğe bağlı. Bu yöntem, doğrulama kodu sağlanan telefon numarasına SMS ile gönderildikten sonra çağrılır.

Bu yöntem çağrıldığında çoğu uygulama, kullanıcıdan SMS mesajındaki doğrulama kodunu yazmasını isteyen bir kullanıcı arayüzü görüntüler. (Aynı zamanda, otomatik doğrulama arka planda devam ediyor olabilir.) Ardından, kullanıcı doğrulama kodunu girdikten sonra, doğrulama kodunu ve yönteme iletilen doğrulama kimliğini kullanarak PhoneAuthCredential nesnesi oluşturabilirsiniz. Daha sonra bu nesneyi kullanıcının oturumu açmak için kullanabilirsiniz. Ancak bazı uygulamalar, doğrulama kodu kullanıcı arayüzünü görüntülemeden önce onCodeAutoRetrievalTimeOut çağrılana kadar bekleyebilir (önerilmez).

onCodeAutoRetrievalTimeOut(Dize doğrulamasıkimliği)

İsteğe bağlı. Bu yöntem, önce onVerificationCompleted tetiklemeden verifyPhoneNumber için belirtilen zaman aşımı süresi geçtikten sonra çağrılır. SIM kartı olmayan cihazlarda, SMS otomatik alma özelliği mümkün olmadığından bu yöntem hemen çağrılır.

Bazı uygulamalar, otomatik doğrulama süresi zaman aşımına uğrayana kadar kullanıcı girişini engeller ve ancak bu sürenin sonunda kullanıcıdan SMS mesajındaki doğrulama kodunu yazmasını isteyen bir kullanıcı arayüzü gösterir (önerilmez).

PhoneAuthCredential nesnesi oluşturma

Kullanıcı, Firebase'in kullanıcının telefonuna gönderdiği doğrulama kodunu girdikten sonra, onCodeSent veya onCodeAutoRetrievalTimeOut geri çağırmasına iletilen doğrulama kodunu ve doğrulama kimliğini kullanarak bir PhoneAuthCredential nesnesi oluşturun. (onVerificationCompleted çağrıldığında, doğrudan bir PhoneAuthCredential nesnesi oluşturulur, dolayısıyla bu adımı atlayabilirsiniz.)

PhoneAuthCredential nesnesini oluşturmak için PhoneAuthProvider.getCredential çağrısı yapın:

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Kullanıcının oturumu açın

onVerificationCompleted geri çağırmasında veya PhoneAuthProvider.getCredential numarasını arayarak PhoneAuthCredential nesnesini aldıktan sonra PhoneAuthCredential nesnesini FirebaseAuth.signInWithCredential adlı kullanıcıya ileterek oturum açma akışını tamamlayın:

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Hayali telefon numaralarıyla test etme

Firebase konsolu üzerinden geliştirme için kurgusal telefon numaraları ayarlayabilirsiniz. Hayali telefon numaralarıyla test yapmak şu avantajları sağlar:

  • Kullanım kotanızı tüketmeden telefon numarası kimlik doğrulamasını test edin.
  • Gerçek bir SMS mesajı göndermeden telefon numarası kimlik doğrulamasını test edin.
  • Kısıtlamadan, aynı telefon numarasıyla art arda testler yapın. Bu şekilde, incelemeci test için aynı telefon numarasını kullandığında uygulama mağazası inceleme sürecinde reddedilme riskini en aza indirir.
  • iOS simülatöründe veya Google Play Hizmetleri olmadan bir Android emülatöründe geliştirme yapabilmek gibi ek çaba sarf etmeden geliştirme ortamlarında kolayca test edebilirsiniz.
  • Entegrasyon testlerini, normalde üretim ortamında gerçek telefon numaralarına uygulanan güvenlik kontrolleri tarafından engellenmeden yazın.

Hayali telefon numaraları aşağıdaki şartları karşılamalıdır:

  1. Gerçekten hayali olan ve daha önce var olmayan telefon numaraları kullandığınızdan emin olun. Firebase Authentication, gerçek kullanıcılar tarafından kullanılan mevcut telefon numaralarını test numarası olarak ayarlamanıza izin vermez. Seçeneklerden biri, ABD test telefon numaraları olarak 555 önekli numarayı kullanmaktır. Örneğin: +1 650-555-3434
  2. Telefon numaralarının uzunluk ve diğer kısıtlamalar açısından doğru şekilde biçimlendirilmesi gerekir. Yine de gerçek bir kullanıcının telefon numarasıyla aynı doğrulamadan geçerler.
  3. Geliştirme için en fazla 10 telefon numarası ekleyebilirsiniz.
  4. Tahmin edilmesi zor test telefon numaraları/kodları kullanın ve bunları sık sık değiştirin.

Hayali telefon numaraları ve doğrulama kodları oluşturma

  1. Firebase konsolunda Kimlik Doğrulama bölümünü açın.
  2. Henüz yapmadıysanız Oturum açma yöntemi sekmesinde Telefon sağlayıcısını etkinleştirin.
  3. Test için telefon numaraları akordeon menüsünü açın.
  4. Test etmek istediğiniz telefon numarasını belirtin. Örneğin: +1 650-555-3434.
  5. Bu numara için 6 haneli doğrulama kodunu girin. Örneğin: 654321.
  6. Numarayı ekleyin. Gerekirse fareyle ilgili satırın üzerine gelip çöp kutusu simgesini tıklayarak telefon numarasını ve kodunu silebilirsiniz.

Manuel test

Uygulamanızda hayali bir telefon numarasını doğrudan kullanmaya başlayabilirsiniz. Bu sayede kota sorunları veya kısıtlamayla karşılaşmadan geliştirme aşamalarında manuel testler gerçekleştirebilirsiniz. Google Play Hizmetleri yüklü olmadan doğrudan bir iOS simülatörü veya Android emülatörü üzerinden de test yapabilirsiniz.

Hayali telefon numarasını sağlayıp doğrulama kodunu gönderdiğinizde gerçek bir SMS gönderilmez. Bunun yerine, oturum açma işlemini tamamlamak için önceden yapılandırılmış doğrulama kodunu sağlamanız gerekir.

Oturum açma işlemi tamamlandığında, bu telefon numarasıyla bir Firebase kullanıcısı oluşturulur. Kullanıcı, gerçek bir telefon numarası kullanıcısıyla aynı davranış ve özelliklere sahiptir ve Realtime Database/Cloud Firestore ile diğer hizmetlere aynı şekilde erişebilir. Bu işlem sırasında basılan kimlik jetonu, gerçek bir telefon numarası kullanıcısıyla aynı imzaya sahiptir.

Diğer bir seçenek de erişimi daha fazla kısıtlamak istiyorsanız bu kullanıcıları sahte kullanıcı olarak ayırt etmek için özel hak talepleri aracılığıyla bir test rolü belirlemektir.

Test için reCAPTCHA akışını manuel olarak tetiklemek istiyorsanız forceRecaptchaFlowForTesting() yöntemini kullanın.

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

Entegrasyon testi

Firebase Authentication, manuel teste ek olarak telefon kimlik doğrulama testi için entegrasyon testleri yazmaya yardımcı olacak API'ler de sağlar. Bu API'ler, iOS'te web ve sessiz push bildirimlerindeki reCAPTCHA şartını devre dışı bırakarak uygulama doğrulamayı devre dışı bırakır. Böylece bu akışlarda otomasyon testleri yapılabilir ve uygulanması kolaylaşır. Ayrıca, Android'de anında doğrulama akışlarını test etme imkanı sağlarlar.

Android'de signInWithPhoneNumber aramasından önce setAppVerificationDisabledForTesting() numaralı telefonu arayın. Bu yöntem, uygulama doğrulamasını otomatik olarak devre dışı bırakarak telefon numarasını manuel olarak çözmeden iletmenize olanak tanır. Play Integrity ve reCAPTCHA devre dışı bırakılsa bile, gerçek bir telefon numarası kullanıldığında oturum açma işlemi tamamlanamaz. Bu API ile yalnızca hayali telefon numaraları kullanılabilir.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

verifyPhoneNumber numarasını hayali bir numarayla aramak onCodeSent geri çağırmasını tetikler. Bu durumda ilgili doğrulama kodunu sağlamanız gerekir. Bu, Android Emülatörlerde test yapılmasına olanak tanır.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Ayrıca setAutoRetrievedSmsCodeForPhoneNumber numaralı telefonu arayıp otomatik alma için kurgusal numarayı ve ilgili doğrulama kodunu ayarlayarak Android'de otomatik alma akışlarını test edebilirsiniz.

verifyPhoneNumber çağrıldığında, doğrudan PhoneAuthCredential ile onVerificationCompleted öğesini tetikler. Bu özellik yalnızca kurgusal telefon numaraları için kullanılabilir.

Uygulamanızı Google Play Store'da yayınlarken bu ayarın devre dışı bırakıldığından ve hayali telefon numaralarının uygulamanıza sabitlenmediğinden emin olun.

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Sonraki adımlar

Bir kullanıcı ilk kez oturum açtıktan sonra yeni bir kullanıcı hesabı oluşturulur ve kullanıcının oturum açtığı kimlik bilgilerine (kullanıcı adı ve şifre, telefon numarası veya kimlik doğrulama sağlayıcı bilgisi) bağlanır. Bu yeni hesap Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığından bağımsız olarak projenizdeki her uygulamada kullanıcıyı tanımlamak için kullanılabilir.

  • Uygulamalarınızda kullanıcının temel profil bilgilerini FirebaseUser nesnesinden alabilirsiniz. Kullanıcıları Yönetme sayfasına göz atın.

  • Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda, oturum açan kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların, birden fazla kimlik doğrulama sağlayıcı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz.

Bir kullanıcının oturumunu kapatmak için signOut numaralı telefonu arayın:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();