Bir Telefon Numarası kullanarak Android'de Firebase ile kimlik doğrulaması yapın

Bir kullanıcının telefonuna SMS mesajı göndererek oturum açmak için Firebase Authentication'ı kullanabilirsiniz. Kullanıcı, SMS mesajında ​​bulunan bir kerelik kodu kullanarak oturum açar.

Uygulamanıza telefon numarasıyla oturum açmayı eklemenin en kolay yolu, telefon numarasıyla oturum açma için oturum açma akışlarının yanı sıra parola tabanlı ve birleşik oturum açma işlemlerini uygulayan bir açılır oturum açma pencere öğesi içeren FirebaseUI'yi kullanmaktır. -içinde. Bu belge, Firebase SDK kullanılarak bir telefon numarası oturum açma akışının nasıl uygulanacağını açıklar.

Sen başlamadan önce

  1. Henüz yapmadıysanız, Android projenize Firebase'i ekleyin .
  2. Firebase Android BoM kullanarak, modülünüzdeki (app-level) Gradle dosyanızdaki (genellikle app/build.gradle ) Firebase Authentication Android kitaplığının bağımlılığını bildirin.

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

    (Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin

    Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.

    dependencies {
        // Declare 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:21.0.6'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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-ktx'
    }
    

    Firebase Android BoM'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

    (Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin

    Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.

    dependencies {
        // Declare 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-ktx:21.0.6'
    }
    
  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 için İstemcinizin Kimliğini Doğrulama bölümüne bakın.

Güvenlik endişeleri

Yalnızca bir telefon numarası kullanarak kimlik doğrulama, uygun olmakla birlikte, bir telefon numarasına sahip olmak kullanıcılar arasında kolayca aktarılabildiğinden, diğer mevcut yöntemlerden daha az güvenlidir. Ayrıca, birden fazla kullanıcı profiline sahip cihazlarda, SMS mesajı alabilen herhangi bir kullanıcı, cihazın telefon numarasını kullanarak bir hesapta oturum açabilir.

Uygulamanızda telefon numarası tabanlı oturum açmayı kullanıyorsanız, bunu daha güvenli oturum açma yöntemleriyle birlikte sunmalı ve kullanıcıları telefon numarasıyla oturum açmanın güvenlik değiş tokuşları hakkında bilgilendirmelisiniz.

Firebase projeniz için Telefon Numarası ile oturum açmayı etkinleştirin

Kullanıcılarda SMS ile oturum açmak için önce Firebase projeniz için Telefon Numarası ile oturum açma yöntemini etkinleştirmelisiniz:

  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 etkilenmeyeceği kadar yüksektir. Ancak, telefonla kimlik doğrulama ile çok yüksek sayıda kullanıcıyla oturum açmanız gerekiyorsa, fiyatlandırma planınızı yükseltmeniz gerekebilir. Fiyatlandırma sayfasına bakın.

Uygulama doğrulamasını etkinleştir

Telefon numarası kimlik doğrulamasını kullanmak için Firebase, uygulamanızdan telefon numarası oturum açma isteklerinin geldiğini doğrulayabilmelidir. Firebase Authentication'ın bunu gerçekleştirmesinin iki yolu vardır:

  • SafetyNet : Bir kullanıcının Google Play Hizmetleri yüklü bir cihazı varsa ve Firebase Authentication, cihazın Android SafetyNet ile yasal olduğunu doğrulayabiliyorsa, telefon numarasıyla oturum açma işlemi devam edebilir.
  • SafetyNet'i Firebase Authentication ile kullanmak üzere etkinleştirmek için:

    1. Google Cloud Console'da projeniz için Android DeviceCheck API'sini etkinleştirin. Varsayılan Firebase API Anahtarı kullanılacak ve DeviceCheck API'sine erişmesine izin verilmesi gerekiyor.
    2. Uygulamanızın SHA-256 parmak izini henüz belirlemediyseniz, bunu Firebase konsolunun Ayarlar Sayfasından yapın. Uygulamanızın SHA-256 parmak izini nasıl alacağınızla ilgili ayrıntılar için İstemcinizin Kimliğini Doğrulama bölümüne bakın.
  • reCAPTCHA doğrulaması : Kullanıcının Google Play Hizmetleri desteğine sahip olmaması veya uygulamanızı bir öykünücü üzerinde test etme gibi durumlarda SafetyNet'in kullanılamaması durumunda, Firebase Kimlik Doğrulaması telefonda oturum açma akışını tamamlamak için bir reCAPTCHA doğrulaması kullanır. reCAPTCHA sorgulaması genellikle kullanıcının herhangi bir şeyi çözmesine gerek kalmadan tamamlanabilir. Lütfen bu akışın uygulamanızla ilişkilendirilmiş bir SHA-1 gerektirdiğini unutmayın.

Kullanıcının telefonuna bir doğrulama kodu gönderin

Telefon numarası ile oturum açmayı başlatmak için kullanıcıya telefon numarasını yazmasını isteyen bir arayüz sunun. Yasal gereksinimler değişiklik gösterir, ancak en iyi uygulama olarak ve kullanıcılarınızın beklentilerini belirlemek için, telefonla oturum açmayı kullanırlarsa doğrulama için bir SMS mesajı alabileceklerini ve standart ücretlerin geçerli olduğunu onlara bildirmelisiniz.

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

Java

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

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)

DoğrulamaPhoneNumber yöntemi yeniden girişlidir: Bir etkinliğin verifyPhoneNumber yönteminde olduğu gibi, onu birden çok kez onStart , orijinal istek zaman aşımına verifyPhoneNumber yöntemi ikinci bir SMS göndermez.

Uygulamanız kullanıcı oturum açmadan önce kapanırsa (örneğin, kullanıcı SMS uygulamasını kullanırken) telefon numarası oturum açma işlemini sürdürmek için bu davranışı kullanabilirsiniz. verifyPhoneNumber sonra, doğrulamanın devam ettiğini gösteren bir bayrak ayarlayın. Ardından, bayrağı Activity'nizin onSaveInstanceState yöntemine kaydedin ve bayrağı onRestoreInstanceState içinde geri yükleyin. Son olarak, Aktivitenizin onStart yönteminde, doğrulamanın halihazırda devam edip etmediğini kontrol edin ve öyleyse, verifyPhoneNumber tekrar arayın. Doğrulama tamamlandığında veya başarısız olduğunda bayrağı temizlediğinizden emin olun (bkz. Doğrulama geri aramaları ).

Ekran döndürmeyi ve diğer Aktivite yeniden başlatma örneklerini kolayca işlemek için Aktivitenizi doğrulamaPhoneNumber yöntemine verifyPhoneNumber . Aktivite durduğunda geri aramalar otomatik olarak ayrılacaktır, böylece geri arama yöntemlerinde UI geçiş kodunu özgürce yazabilirsiniz.

Firebase tarafından gönderilen SMS mesajı, setLanguageCode yöntemi aracılığıyla yetkilendirme dili belirtilerek de yerelleştirilebilir.

Java

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

Kotlin+KTX

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

PhoneAuthProvider.verifyPhoneNumber aradığınızda, isteğin sonuçlarını işleyen geri arama işlevlerinin uygulamalarını içeren bir OnVerificationStateChangedCallbacks örneğini de sağlamanız gerekir. Örneğin:

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(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(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
        }

        // 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;
    }
};

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
        }

        // 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
    }
}

Doğrulama geri aramaları

Çoğu uygulamada onVerificationCompleted , onVerificationFailed ve onCodeSent geri aramalarını uygularsınız. Uygulamanızın gereksinimlerine bağlı olarak onCodeAutoRetrievalTimeOut da uygulayabilirsiniz.

onVerificationCompleted(PhoneAuthCredential)

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

  • Anında doğrulama: Bazı durumlarda telefon numarası, bir doğrulama kodu göndermeye veya girmeye gerek kalmadan anında doğrulanabilir.
  • Otomatik alma: Bazı cihazlarda Google Play hizmetleri, gelen doğrulama SMS'lerini otomatik olarak algılayabilir ve kullanıcı eylemi olmadan 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'sini kullanır.
Her iki durumda da, kullanıcının telefon numarası başarıyla doğrulanmıştır ve kullanıcıda oturum açmak için geri aramaya iletilen PhoneAuthCredential nesnesini kullanabilirsiniz.

onVerificationFailed(FirebaseException)

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

onCodeSent(Dize doğrulama kimliği, PhoneAuthProvider.ForceResendingToken)

İsteğe bağlı. Bu yöntem, sağlanan telefon numarasına doğrulama kodu 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 yazdıktan sonra, bir PhoneAuthCredential nesnesi oluşturmak için doğrulama kodunu ve yönteme iletilen doğrulama kimliğini kullanabilirsiniz. sırayla kullanıcıyı oturum açmak için kullanabilirsiniz. Ancak bazı uygulamalar, doğrulama kodu kullanıcı arabirimini görüntülemeden önce onCodeAutoRetrievalTimeOut kadar bekleyebilir (önerilmez).

onCodeAutoRetrievalTimeOut(Dize doğrulamaId)

İsteğe bağlı. Bu yöntem, ilk olarak verifyPhoneNumber tetiklemesi olmadan onVerificationCompleted doğrulamak için belirtilen zaman aşımı süresi geçtikten sonra çağrılır. SIM kartı olmayan cihazlarda, SMS otomatik alımı mümkün olmadığı için bu yöntem hemen çağrılır.

Bazı uygulamalar, otomatik doğrulama süresi dolana kadar kullanıcı girişini engeller ve ancak o zaman kullanıcıdan SMS mesajındaki doğrulama kodunu yazmasını isteyen bir UI görüntüler (önerilmez).

PhoneAuthCredential nesnesi oluşturun

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

PhoneAuthCredential nesnesini oluşturmak için PhoneAuthProvider.getCredential öğesini arayın:

Java

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

Kotlin+KTX

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

Kullanıcıda oturum açın

onVerificationCompleted geri aramasında veya PhoneAuthProvider.getCredential çağırarak bir PhoneAuthCredential nesnesi aldıktan sonra, PhoneAuthCredential nesnesini FirebaseAuth.signInWithCredential öğesine ileterek oturum açma akışını tamamlayın:

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
                        }
                    }
                }
            });
}

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
                }
            }
}

Kurgusal telefon numaralarıyla test edin

Firebase konsolu aracılığıyla geliştirme için kurgusal telefon numaraları ayarlayabilirsiniz. Kurgusal telefon numaralarıyla test yapmak şu avantajları sağlar:

  • Kullanım kotanızı tüketmeden telefon numarası doğrulamasını test edin.
  • Gerçek bir SMS mesajı göndermeden telefon numarası doğrulamasını test edin.
  • Kısıtlanmadan aynı telefon numarasıyla ardışık testler yapın. Bu, gözden geçirenin test için aynı telefon numarasını kullanması durumunda, App Store inceleme sürecinde reddedilme riskini en aza indirir.
  • Google Play Hizmetleri olmadan bir iOS simülatöründe veya bir Android öykünücüsünde geliştirme yeteneği gibi herhangi bir ek çaba harcamadan geliştirme ortamlarında kolayca test edin.
  • Bir üretim ortamında normal olarak gerçek telefon numaralarına uygulanan güvenlik kontrolleri tarafından engellenmeden entegrasyon testleri yazın.

Kurgusal telefon numaraları şu gereksinimleri karşılamalıdır:

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

Kurgusal telefon numaraları ve doğrulama kodları oluşturun

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

Manuel test

Uygulamanızda doğrudan hayali bir telefon numarası kullanmaya başlayabilirsiniz. Bu, geliştirme aşamalarında kota sorunlarıyla veya kısıtlamalarla karşılaşmadan manuel test yapmanızı sağlar. Ayrıca, Google Play Hizmetleri yüklü olmadan doğrudan bir iOS simülatöründen veya Android öykünücüsünden de test edebilirsiniz.

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

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

Başka bir seçenek de, erişimi daha fazla kısıtlamak istiyorsanız, onları sahte kullanıcılar olarak ayırt etmek için bu kullanıcılar üzerinde özel talepler aracılığıyla bir test rolü belirlemektir .

Test amacıyla reCAPTCHA akışını manuel olarak tetiklemek için 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 sağlar. Bu API'ler, web'de reCAPTCHA gereksinimini ve iOS'ta sessiz anında iletme bildirimlerini devre dışı bırakarak uygulama doğrulamasını devre dışı bırakır. Bu, bu akışlarda otomasyon testini mümkün kılar ve uygulanmasını kolaylaştırır. Ayrıca, Android'de anında doğrulama akışlarını test etme yeteneği sağlamaya yardımcı olurlar.

Android'de, signInWithPhoneNumber çağrısından önce signInWithPhoneNumber setAppVerificationDisabledForTesting() öğesini çağırın. Bu, uygulama doğrulamasını otomatik olarak devre dışı bırakarak telefon numarasını manuel olarak çözmeden iletmenize olanak tanır. reCAPTCHA ve/veya SafetyNet devre dışı bırakılsa bile, gerçek bir telefon numarasının kullanılmasının yine de oturum açma işlemini tamamlamayacağını unutmayın. Bu API ile yalnızca hayali telefon numaraları kullanılabilir.

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

DoğrulamaPhoneNumber'ı kurgusal bir numarayla aramak, ilgili doğrulama kodunu sağlamanız gereken verifyPhoneNumber geri onCodeSent tetikler. Bu, Android Emülatörlerinde test yapılmasına izin verir.

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(String verificationId,
                                   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(PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(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)

Ek olarak, setAutoRetrievedSmsCodeForPhoneNumber çağırarak otomatik alma için kurgusal sayıyı ve buna karşılık gelen doğrulama kodunu ayarlayarak Android'de otomatik alma akışlarını test edebilirsiniz.

verifyPhoneNumber çağrıldığında, doğrudan onVerificationCompleted ile PhoneAuthCredential öğesini tetikler. Bu yalnızca hayali telefon numaralarıyla çalışır.

Uygulamanızı Google Play mağazasında yayınlarken bunun devre dışı bırakıldığından ve uygulamanızda hiçbir hayali telefon numarasının sabit kodlanmadığından 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(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 oturum açtığı kullanıcı adı ve parolası, telefon numarası veya yetkilendirme sağlayıcı bilgileri gibi kimlik bilgileriyle ilişkilendirilir. 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 bir 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 konusuna bakın.

  • Firebase Gerçek Zamanlı Veritabanınız ve Bulut Depolama Güvenlik Kurallarınızda , oturum açmış kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

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

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

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()
,

Bir kullanıcının telefonuna SMS mesajı göndererek oturum açmak için Firebase Authentication'ı kullanabilirsiniz. Kullanıcı, SMS mesajında ​​bulunan bir kerelik kodu kullanarak oturum açar.

Uygulamanıza telefon numarasıyla oturum açmayı eklemenin en kolay yolu, telefon numarasıyla oturum açma için oturum açma akışlarının yanı sıra parola tabanlı ve birleşik oturum açma işlemlerini uygulayan bir açılır oturum açma pencere öğesi içeren FirebaseUI'yi kullanmaktır. -içinde. Bu belge, Firebase SDK kullanılarak bir telefon numarası oturum açma akışının nasıl uygulanacağını açıklar.

Sen başlamadan önce

  1. Henüz yapmadıysanız, Android projenize Firebase'i ekleyin .
  2. Firebase Android BoM kullanarak, modülünüzdeki (app-level) Gradle dosyanızdaki (genellikle app/build.gradle ) Firebase Authentication Android kitaplığının bağımlılığını bildirin.

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

    (Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin

    Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.

    dependencies {
        // Declare 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:21.0.6'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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-ktx'
    }
    

    Firebase Android BoM'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

    (Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin

    Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.

    dependencies {
        // Declare 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-ktx:21.0.6'
    }
    
  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 için İstemcinizin Kimliğini Doğrulama bölümüne bakın.

Güvenlik endişeleri

Yalnızca bir telefon numarası kullanarak kimlik doğrulama, uygun olmakla birlikte, bir telefon numarasına sahip olmak kullanıcılar arasında kolayca aktarılabildiğinden, diğer mevcut yöntemlerden daha az güvenlidir. Ayrıca, birden fazla kullanıcı profiline sahip cihazlarda, SMS mesajı alabilen herhangi bir kullanıcı, cihazın telefon numarasını kullanarak bir hesapta oturum açabilir.

Uygulamanızda telefon numarası tabanlı oturum açmayı kullanıyorsanız, bunu daha güvenli oturum açma yöntemleriyle birlikte sunmalı ve kullanıcıları telefon numarasıyla oturum açmanın güvenlik değiş tokuşları hakkında bilgilendirmelisiniz.

Firebase projeniz için Telefon Numarası ile oturum açmayı etkinleştirin

Kullanıcılarda SMS ile oturum açmak için önce Firebase projeniz için Telefon Numarası ile oturum açma yöntemini etkinleştirmelisiniz:

  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 etkilenmeyeceği kadar yüksektir. Ancak, telefonla kimlik doğrulama ile çok yüksek sayıda kullanıcıyla oturum açmanız gerekiyorsa, fiyatlandırma planınızı yükseltmeniz gerekebilir. Fiyatlandırma sayfasına bakın.

Uygulama doğrulamasını etkinleştir

Telefon numarası kimlik doğrulamasını kullanmak için Firebase, uygulamanızdan telefon numarası oturum açma isteklerinin geldiğini doğrulayabilmelidir. Firebase Authentication'ın bunu gerçekleştirmesinin iki yolu vardır:

  • SafetyNet : Bir kullanıcının Google Play Hizmetleri yüklü bir cihazı varsa ve Firebase Authentication, cihazın Android SafetyNet ile yasal olduğunu doğrulayabiliyorsa, telefon numarasıyla oturum açma işlemi devam edebilir.
  • SafetyNet'i Firebase Authentication ile kullanmak üzere etkinleştirmek için:

    1. Google Cloud Console'da projeniz için Android DeviceCheck API'sini etkinleştirin. Varsayılan Firebase API Anahtarı kullanılacak ve DeviceCheck API'sine erişmesine izin verilmesi gerekiyor.
    2. Uygulamanızın SHA-256 parmak izini henüz belirlemediyseniz, bunu Firebase konsolunun Ayarlar Sayfasından yapın. Uygulamanızın SHA-256 parmak izini nasıl alacağınızla ilgili ayrıntılar için İstemcinizin Kimliğini Doğrulama bölümüne bakın.
  • reCAPTCHA doğrulaması : Kullanıcının Google Play Hizmetleri desteğine sahip olmaması veya uygulamanızı bir öykünücü üzerinde test etme gibi durumlarda SafetyNet'in kullanılamaması durumunda, Firebase Kimlik Doğrulaması telefonda oturum açma akışını tamamlamak için bir reCAPTCHA doğrulaması kullanır. reCAPTCHA sorgulaması genellikle kullanıcının herhangi bir şeyi çözmesine gerek kalmadan tamamlanabilir. Lütfen bu akışın uygulamanızla ilişkilendirilmiş bir SHA-1 gerektirdiğini unutmayın.

Kullanıcının telefonuna bir doğrulama kodu gönderin

Telefon numarası ile oturum açmayı başlatmak için kullanıcıya telefon numarasını yazmasını isteyen bir arayüz sunun. Yasal gereksinimler değişiklik gösterir, ancak en iyi uygulama olarak ve kullanıcılarınızın beklentilerini belirlemek için, telefonla oturum açmayı kullanırlarsa doğrulama için bir SMS mesajı alabileceklerini ve standart ücretlerin geçerli olduğunu onlara bildirmelisiniz.

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

Java

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

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)

DoğrulamaPhoneNumber yöntemi yeniden girişlidir: Bir etkinliğin verifyPhoneNumber yönteminde olduğu gibi, onu birden çok kez onStart , orijinal istek zaman aşımına verifyPhoneNumber yöntemi ikinci bir SMS göndermez.

Uygulamanız kullanıcı oturum açmadan önce kapanırsa (örneğin, kullanıcı SMS uygulamasını kullanırken) telefon numarası oturum açma işlemini sürdürmek için bu davranışı kullanabilirsiniz. verifyPhoneNumber sonra, doğrulamanın devam ettiğini gösteren bir bayrak ayarlayın. Ardından, bayrağı Activity'nizin onSaveInstanceState yöntemine kaydedin ve bayrağı onRestoreInstanceState içinde geri yükleyin. Son olarak, Aktivitenizin onStart yönteminde, doğrulamanın halihazırda devam edip etmediğini kontrol edin ve öyleyse, verifyPhoneNumber tekrar arayın. Doğrulama tamamlandığında veya başarısız olduğunda bayrağı temizlediğinizden emin olun (bkz. Doğrulama geri aramaları ).

Ekran döndürmeyi ve diğer Aktivite yeniden başlatma örneklerini kolayca işlemek için Aktivitenizi doğrulamaPhoneNumber yöntemine verifyPhoneNumber . Aktivite durduğunda geri aramalar otomatik olarak ayrılacaktır, böylece geri arama yöntemlerinde UI geçiş kodunu özgürce yazabilirsiniz.

Firebase tarafından gönderilen SMS mesajı, setLanguageCode yöntemi aracılığıyla yetkilendirme dili belirtilerek de yerelleştirilebilir.

Java

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

Kotlin+KTX

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

PhoneAuthProvider.verifyPhoneNumber aradığınızda, isteğin sonuçlarını işleyen geri arama işlevlerinin uygulamalarını içeren bir OnVerificationStateChangedCallbacks örneğini de sağlamanız gerekir. Örneğin:

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(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(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
        }

        // 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;
    }
};

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
        }

        // 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
    }
}

Doğrulama geri aramaları

Çoğu uygulamada onVerificationCompleted , onVerificationFailed ve onCodeSent geri aramalarını uygularsınız. Uygulamanızın gereksinimlerine bağlı olarak onCodeAutoRetrievalTimeOut da uygulayabilirsiniz.

onVerificationCompleted(PhoneAuthCredential)

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

  • Anında doğrulama: Bazı durumlarda telefon numarası, bir doğrulama kodu göndermeye veya girmeye gerek kalmadan anında doğrulanabilir.
  • Otomatik alma: Bazı cihazlarda Google Play hizmetleri, gelen doğrulama SMS'lerini otomatik olarak algılayabilir ve kullanıcı eylemi olmadan 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'sini kullanır.
Her iki durumda da, kullanıcının telefon numarası başarıyla doğrulanmıştır ve kullanıcıda oturum açmak için geri aramaya iletilen PhoneAuthCredential nesnesini kullanabilirsiniz.

onVerificationFailed(FirebaseException)

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

onCodeSent(Dize doğrulama kimliği, PhoneAuthProvider.ForceResendingToken)

İsteğe bağlı. Bu yöntem, sağlanan telefon numarasına doğrulama kodu 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 yazdıktan sonra, bir PhoneAuthCredential nesnesi oluşturmak için doğrulama kodunu ve yönteme iletilen doğrulama kimliğini kullanabilirsiniz. sırayla kullanıcıyı oturum açmak için kullanabilirsiniz. Ancak bazı uygulamalar, doğrulama kodu kullanıcı arabirimini görüntülemeden önce onCodeAutoRetrievalTimeOut kadar bekleyebilir (önerilmez).

onCodeAutoRetrievalTimeOut(Dize doğrulamaId)

İsteğe bağlı. Bu yöntem, ilk olarak verifyPhoneNumber tetiklemesi olmadan onVerificationCompleted doğrulamak için belirtilen zaman aşımı süresi geçtikten sonra çağrılır. SIM kartı olmayan cihazlarda, SMS otomatik alımı mümkün olmadığı için bu yöntem hemen çağrılır.

Bazı uygulamalar, otomatik doğrulama süresi dolana kadar kullanıcı girişini engeller ve ancak o zaman kullanıcıdan SMS mesajındaki doğrulama kodunu yazmasını isteyen bir UI görüntüler (önerilmez).

PhoneAuthCredential nesnesi oluşturun

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

PhoneAuthCredential nesnesini oluşturmak için PhoneAuthProvider.getCredential öğesini arayın:

Java

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

Kotlin+KTX

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

Kullanıcıda oturum açın

onVerificationCompleted geri aramasında veya PhoneAuthProvider.getCredential çağırarak bir PhoneAuthCredential nesnesi aldıktan sonra, PhoneAuthCredential nesnesini FirebaseAuth.signInWithCredential öğesine ileterek oturum açma akışını tamamlayın:

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
                        }
                    }
                }
            });
}

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
                }
            }
}

Kurgusal telefon numaralarıyla test edin

Firebase konsolu aracılığıyla geliştirme için kurgusal telefon numaraları ayarlayabilirsiniz. Kurgusal telefon numaralarıyla test yapmak şu avantajları sağlar:

  • Kullanım kotanızı tüketmeden telefon numarası doğrulamasını test edin.
  • Gerçek bir SMS mesajı göndermeden telefon numarası doğrulamasını test edin.
  • Kısıtlanmadan aynı telefon numarasıyla ardışık testler yapın. Bu, gözden geçirenin test için aynı telefon numarasını kullanması durumunda, App Store inceleme sürecinde reddedilme riskini en aza indirir.
  • Google Play Hizmetleri olmadan bir iOS simülatöründe veya bir Android öykünücüsünde geliştirme yeteneği gibi herhangi bir ek çaba harcamadan geliştirme ortamlarında kolayca test edin.
  • Bir üretim ortamında normal olarak gerçek telefon numaralarına uygulanan güvenlik kontrolleri tarafından engellenmeden entegrasyon testleri yazın.

Kurgusal telefon numaraları şu gereksinimleri karşılamalıdır:

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

Kurgusal telefon numaraları ve doğrulama kodları oluşturun

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

Manuel test

Uygulamanızda doğrudan hayali bir telefon numarası kullanmaya başlayabilirsiniz. Bu, geliştirme aşamalarında kota sorunlarıyla veya kısıtlamalarla karşılaşmadan manuel test yapmanızı sağlar. Ayrıca, Google Play Hizmetleri yüklü olmadan doğrudan bir iOS simülatöründen veya Android öykünücüsünden de test edebilirsiniz.

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

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

Başka bir seçenek de, erişimi daha fazla kısıtlamak istiyorsanız, onları sahte kullanıcılar olarak ayırt etmek için bu kullanıcılar üzerinde özel talepler aracılığıyla bir test rolü belirlemektir .

Test amacıyla reCAPTCHA akışını manuel olarak tetiklemek için 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 sağlar. Bu API'ler, web'de reCAPTCHA gereksinimini ve iOS'ta sessiz anında iletme bildirimlerini devre dışı bırakarak uygulama doğrulamasını devre dışı bırakır. Bu, bu akışlarda otomasyon testini mümkün kılar ve uygulanmasını kolaylaştırır. Ayrıca, Android'de anında doğrulama akışlarını test etme yeteneği sağlamaya yardımcı olurlar.

Android'de, signInWithPhoneNumber çağrısından önce signInWithPhoneNumber setAppVerificationDisabledForTesting() öğesini çağırın. Bu, uygulama doğrulamasını otomatik olarak devre dışı bırakarak telefon numarasını manuel olarak çözmeden iletmenize olanak tanır. reCAPTCHA ve/veya SafetyNet devre dışı bırakılsa bile, gerçek bir telefon numarasının kullanılmasının yine de oturum açma işlemini tamamlamayacağını unutmayın. Bu API ile yalnızca hayali telefon numaraları kullanılabilir.

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

DoğrulamaPhoneNumber'ı kurgusal bir numarayla aramak, ilgili doğrulama kodunu sağlamanız gereken verifyPhoneNumber geri onCodeSent tetikler. Bu, Android Emülatörlerinde test yapılmasına izin verir.

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(String verificationId,
                                   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(PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(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)

Ek olarak, setAutoRetrievedSmsCodeForPhoneNumber çağırarak otomatik alma için kurgusal sayıyı ve buna karşılık gelen doğrulama kodunu ayarlayarak Android'de otomatik alma akışlarını test edebilirsiniz.

verifyPhoneNumber çağrıldığında, doğrudan onVerificationCompleted ile PhoneAuthCredential öğesini tetikler. Bu yalnızca hayali telefon numaralarıyla çalışır.

Uygulamanızı Google Play mağazasında yayınlarken bunun devre dışı bırakıldığından ve uygulamanızda hiçbir hayali telefon numarasının sabit kodlanmadığından 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(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 oturum açtığı kullanıcı adı ve parolası, telefon numarası veya yetkilendirme sağlayıcı bilgileri gibi kimlik bilgileriyle ilişkilendirilir. 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 bir 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 konusuna bakın.

  • Firebase Gerçek Zamanlı Veritabanınız ve Bulut Depolama Güvenlik Kurallarınızda , oturum açmış kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

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

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

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()