قم بالمصادقة مع Firebase على Android باستخدام رقم الهاتف

يمكنك استخدام مصادقة Firebase لتسجيل دخول المستخدم عن طريق إرسال رسالة SMS إلى هاتف المستخدم. يقوم المستخدم بتسجيل الدخول باستخدام رمز لمرة واحدة موجود في الرسالة النصية القصيرة.

أسهل طريقة لإضافة تسجيل الدخول برقم الهاتف إلى تطبيقك هي استخدام FirebaseUI ، الذي يتضمن أداة تسجيل الدخول المنسدلة التي تنفذ تدفقات تسجيل الدخول لتسجيل الدخول برقم الهاتف، بالإضافة إلى تسجيل الدخول الموحد والمعتمد على كلمة المرور -في. يصف هذا المستند كيفية تنفيذ تدفق تسجيل الدخول برقم الهاتف باستخدام Firebase SDK.

قبل ان تبدأ

  1. إذا لم تكن قد قمت بذلك بالفعل، فأضف Firebase إلى مشروع Android الخاص بك .
  2. في ملف Gradle الخاص بالوحدة النمطية (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle )، أضف التبعية لمصادقة Firebase مكتبة لالروبوت. نوصي باستخدام Firebase Android BoM للتحكم في إصدار المكتبة.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.2"))
    
        // 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 ، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Firebase Android.

    (بديل) أضف تبعيات مكتبة Firebase دون استخدام BoM

    إذا اخترت عدم استخدام Firebase BoM، فيجب عليك تحديد كل إصدار من مكتبة Firebase في سطر التبعية الخاص به.

    لاحظ أنه إذا كنت تستخدم مكتبات Firebase متعددة في تطبيقك، فإننا نوصي بشدة باستخدام BoM لإدارة إصدارات المكتبة، مما يضمن توافق جميع الإصدارات.

    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:22.3.1")
    }
    
    هل تبحث عن وحدة مكتبة خاصة بـ Kotlin؟ بدءًا من أكتوبر 2023 (Firebase BoM 32.5.0) ، يمكن لمطوري Kotlin وJava الاعتماد على وحدة المكتبة الرئيسية (لمزيد من التفاصيل، راجع الأسئلة الشائعة حول هذه المبادرة ).
  3. إذا لم تكن قد قمت بعد بربط تطبيقك بمشروع Firebase الخاص بك، فقم بذلك من وحدة تحكم Firebase .
  4. إذا لم تكن قد قمت بالفعل بتعيين تجزئة SHA-1 لتطبيقك في وحدة تحكم Firebase ، فافعل ذلك. راجع مصادقة عميلك للحصول على معلومات حول العثور على تجزئة SHA-1 لتطبيقك.

مخاوف أمنية

إن المصادقة باستخدام رقم هاتف فقط، على الرغم من أنها مريحة، إلا أنها أقل أمانًا من الطرق الأخرى المتاحة، نظرًا لأنه يمكن بسهولة نقل ملكية رقم الهاتف بين المستخدمين. وأيضًا، على الأجهزة التي تحتوي على ملفات تعريف مستخدمين متعددة، يمكن لأي مستخدم يمكنه تلقي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.

إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك، فيجب عليك تقديمه جنبًا إلى جنب مع طرق تسجيل دخول أكثر أمانًا، وإبلاغ المستخدمين بالمقايضات الأمنية لاستخدام تسجيل الدخول برقم الهاتف.

تمكين تسجيل الدخول برقم الهاتف لمشروع Firebase الخاص بك

لتسجيل دخول المستخدمين عبر الرسائل القصيرة، يجب عليك أولاً تمكين طريقة تسجيل الدخول برقم الهاتف لمشروع Firebase الخاص بك:

  1. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  2. في صفحة طريقة تسجيل الدخول ، قم بتمكين طريقة تسجيل الدخول برقم الهاتف .

تعد حصة طلبات تسجيل الدخول برقم هاتف Firebase عالية بما يكفي بحيث لا تتأثر معظم التطبيقات. ومع ذلك، إذا كنت بحاجة إلى تسجيل الدخول لعدد كبير جدًا من المستخدمين باستخدام مصادقة الهاتف، فقد تحتاج إلى ترقية خطة التسعير الخاصة بك. انظر صفحة التسعير .

تمكين التحقق من التطبيق

لاستخدام مصادقة رقم الهاتف، يجب أن يكون Firebase قادرًا على التحقق من أن طلبات تسجيل الدخول برقم الهاتف تأتي من تطبيقك. هناك ثلاث طرق لتحقيق مصادقة Firebase لهذا:

  • Play Integrity API : إذا كان لدى المستخدم جهاز مثبت عليه خدمات Google Play، ويمكن لمصادقة Firebase التحقق من شرعية الجهاز باستخدام Play Integrity API ، فيمكن متابعة تسجيل الدخول برقم الهاتف. يتم تمكين Play Integrity API في مشروع مملوك لشركة Google بواسطة Firebase Authentication، وليس في مشروعك. ولا يساهم هذا في أي حصص لـ Play Integrity API في مشروعك. يتوفر دعم Play Integrity مع Authentication SDK v21.2.0+ (Firebase BoM v31.4.0+).

    لاستخدام Play Integrity، إذا لم تكن قد حددت بعد بصمة SHA-256 لتطبيقك، فقم بذلك من إعدادات المشروع في وحدة تحكم Firebase. ارجع إلى مصادقة عميلك للحصول على تفاصيل حول كيفية الحصول على بصمة SHA-256 لتطبيقك.

  • التحقق من reCAPTCHA : في حالة عدم إمكانية استخدام Play Integrity، كما هو الحال عندما يكون لدى المستخدم جهاز بدون تثبيت خدمات Google Play، تستخدم مصادقة Firebase التحقق من reCAPTCHA لإكمال تدفق تسجيل الدخول عبر الهاتف. غالبًا ما يمكن إكمال تحدي reCAPTCHA دون أن يضطر المستخدم إلى حل أي شيء. لاحظ أن هذا التدفق يتطلب أن يكون SHA-1 مرتبطًا بالتطبيق الخاص بك. يتطلب هذا التدفق أيضًا أن يكون مفتاح API الخاص بك غير مقيد أو مدرجًا في القائمة المسموح بها لـ PROJECT_ID .firebaseapp.com .

    بعض السيناريوهات التي يتم فيها تشغيل reCAPTCHA:

    • إذا لم يكن جهاز المستخدم النهائي مثبتًا عليه خدمات Google Play.
    • إذا لم يتم توزيع التطبيق من خلال متجر Google Play (على Authentication SDK v21.2.0+ ).
    • إذا كان رمز SafetyNet الذي تم الحصول عليه غير صالح (في إصدارات Authentication SDK < v21.2.0).

    عند استخدام SafetyNet أو Play Integrity للتحقق من التطبيق، تتم تعبئة الحقل %APP_NAME% في قالب الرسائل القصيرة باسم التطبيق المحدد من متجر Google Play. في السيناريوهات التي يتم فيها تشغيل reCAPTCHA، يتم نشر %APP_NAME% كـ PROJECT_ID .firebaseapp.com .

يمكنك فرض تدفق التحقق من reCAPTCHA باستخدام forceRecaptchaFlowForTesting . ويمكنك تعطيل التحقق من التطبيق (عند استخدام أرقام هواتف وهمية) باستخدام setAppVerificationDisabledForTesting .

استكشاف الأخطاء وإصلاحها

  • خطأ "الحالة الأولية مفقودة" عند استخدام reCAPTCHA للتحقق من التطبيق

    يمكن أن يحدث هذا عند اكتمال تدفق reCAPTCHA بنجاح ولكنه لا يعيد توجيه المستخدم مرة أخرى إلى التطبيق الأصلي. في حالة حدوث ذلك، تتم إعادة توجيه المستخدم إلى عنوان URL الاحتياطي PROJECT_ID .firebaseapp.com/__/auth/handler . في متصفحات Firefox، يتم تعطيل فتح روابط التطبيقات الأصلية افتراضيًا. إذا رأيت الخطأ أعلاه على Firefox، فاتبع الخطوات الواردة في تعيين Firefox لنظام Android لفتح الروابط في التطبيقات الأصلية لتمكين فتح روابط التطبيقات.

إرسال رمز التحقق إلى هاتف المستخدم

لبدء تسجيل الدخول برقم الهاتف، قدم للمستخدم واجهة تطالبه بكتابة رقم هاتفه. تختلف المتطلبات القانونية، ولكن كأفضل ممارسة ولتحديد التوقعات للمستخدمين، يجب عليك إبلاغهم بأنهم إذا كانوا يستخدمون تسجيل الدخول عبر الهاتف، فقد يتلقون رسالة نصية قصيرة للتحقق وسيتم تطبيق الأسعار القياسية.

بعد ذلك، قم بتمرير رقم هاتفهم إلى طريقة PhoneAuthProvider.verifyPhoneNumber لمطالبة Firebase بالتحقق من رقم هاتف المستخدم. على سبيل المثال:

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 : إذا اتصلت بها عدة مرات، كما هو الحال في طريقة onStart الخاصة بالنشاط، فلن تقوم طريقة verifyPhoneNumber بإرسال رسالة نصية قصيرة ثانية ما لم تنته مهلة الطلب الأصلي.

يمكنك استخدام هذا السلوك لاستئناف عملية تسجيل الدخول برقم الهاتف إذا تم إغلاق تطبيقك قبل أن يتمكن المستخدم من تسجيل الدخول (على سبيل المثال، أثناء استخدام المستخدم لتطبيق الرسائل القصيرة SMS). بعد الاتصال بـ verifyPhoneNumber ، قم بتعيين علامة تشير إلى أن عملية التحقق قيد التقدم. بعد ذلك، احفظ العلامة في طريقة onSaveInstanceState الخاصة بنشاطك واستعد العلامة في onRestoreInstanceState . أخيرًا، في طريقة onStart الخاصة بنشاطك، تحقق مما إذا كانت عملية التحقق قيد التقدم بالفعل، وإذا كان الأمر كذلك، فاتصل بـ verifyPhoneNumber مرة أخرى. تأكد من مسح العلامة عند اكتمال عملية التحقق أو فشلها (راجع عمليات رد اتصال التحقق ).

للتعامل بسهولة مع دوران الشاشة والحالات الأخرى لإعادة تشغيل النشاط، قم بتمرير نشاطك إلى طريقة verifyPhoneNumber . سيتم فصل عمليات رد الاتصال تلقائيًا عندما يتوقف النشاط، حتى تتمكن من كتابة رمز انتقال واجهة المستخدم بحرية في طرق رد الاتصال.

يمكن أيضًا ترجمة رسالة SMS المرسلة بواسطة Firebase عن طريق تحديد لغة المصادقة عبر طريقة setLanguageCode في مثيل المصادقة الخاص بك.

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 ، يجب عليك أيضًا توفير مثيل OnVerificationStateChangedCallbacks ، الذي يحتوي على تطبيقات وظائف رد الاتصال التي تعالج نتائج الطلب. على سبيل المثال:

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

عمليات الاسترجاعات التحقق

في معظم التطبيقات، يمكنك تنفيذ عمليات الاسترجاعات onVerificationCompleted و onVerificationFailed و onCodeSent . يمكنك أيضًا تنفيذ onCodeAutoRetrievalTimeOut ، وفقًا لمتطلبات تطبيقك.

onVerificationCompleted(PhoneAuthCredential)

يتم استدعاء هذه الطريقة في حالتين:

  • التحقق الفوري: في بعض الحالات يمكن التحقق من رقم الهاتف بشكل فوري دون الحاجة إلى إرسال أو إدخال رمز التحقق.
  • الاسترداد التلقائي: في بعض الأجهزة، يمكن لخدمات Google Play اكتشاف رسالة التحقق النصية القصيرة الواردة تلقائيًا وإجراء التحقق دون إجراء المستخدم. (قد لا تكون هذه الإمكانية متاحة لدى بعض شركات الاتصالات.) يستخدم هذا واجهة برمجة تطبيقات SMS Retriever ، والتي تتضمن تجزئة مكونة من 11 حرفًا في نهاية رسالة SMS.
في كلتا الحالتين، تم التحقق من رقم هاتف المستخدم بنجاح، ويمكنك استخدام كائن PhoneAuthCredential الذي تم تمريره إلى رد الاتصال لتسجيل دخول المستخدم .

onVerificationFailed(FirebaseException)

يتم استدعاء هذه الطريقة استجابةً لطلب تحقق غير صالح، مثل الطلب الذي يحدد رقم هاتف أو رمز تحقق غير صالح.

onCodeSent(معرف التحقق من السلسلة، PhoneAuthProvider.ForceResendingToken)

خياري. يتم استدعاء هذه الطريقة بعد إرسال رمز التحقق عبر الرسائل القصيرة إلى رقم الهاتف المقدم.

عند استدعاء هذه الطريقة، تعرض معظم التطبيقات واجهة مستخدم تطالب المستخدم بكتابة رمز التحقق من رسالة SMS. (في الوقت نفسه، قد يتم إجراء التحقق التلقائي في الخلفية.) بعد ذلك، بعد قيام المستخدم بكتابة رمز التحقق، يمكنك استخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلى الطريقة لإنشاء كائن PhoneAuthCredential ، والذي يمكنك بدوره استخدام لتسجيل الدخول للمستخدم. ومع ذلك، قد تنتظر بعض التطبيقات حتى يتم استدعاء onCodeAutoRetrievalTimeOut قبل عرض واجهة مستخدم رمز التحقق (غير مستحسن).

onCodeAutoRetrievalTimeOut (معرف التحقق من السلسلة)

خياري. يتم استدعاء هذه الطريقة بعد مرور مدة المهلة المحددة للتحقق verifyPhoneNumber دون تشغيل onVerificationCompleted أولاً. على الأجهزة التي لا تحتوي على بطاقات SIM، يتم استدعاء هذه الطريقة على الفور لأن الاسترداد التلقائي للرسائل النصية القصيرة غير ممكن.

تحظر بعض التطبيقات إدخال المستخدم حتى تنتهي مهلة التحقق التلقائي، وعندها فقط تعرض واجهة مستخدم تطالب المستخدم بكتابة رمز التحقق من رسالة SMS (غير مستحسن).

قم بإنشاء كائن PhoneAuthCredential

بعد قيام المستخدم بإدخال رمز التحقق الذي أرسله Firebase إلى هاتف المستخدم، أنشئ كائن PhoneAuthCredential ، باستخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلى رد الاتصال onCodeSent أو onCodeAutoRetrievalTimeOut . (عند استدعاء onVerificationCompleted ، تحصل على كائن PhoneAuthCredential مباشرة، لذا يمكنك تخطي هذه الخطوة.)

لإنشاء كائن PhoneAuthCredential ، اتصل بـ PhoneAuthProvider.getCredential :

Kotlin+KTX

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

Java

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

تسجيل دخول المستخدم

بعد حصولك على كائن PhoneAuthCredential ، سواء في رد الاتصال onVerificationCompleted أو عن طريق استدعاء PhoneAuthProvider.getCredential ، أكمل تدفق تسجيل الدخول عن طريق تمرير كائن PhoneAuthCredential إلى FirebaseAuth.signInWithCredential :

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

اختبار مع أرقام الهواتف الخيالية

يمكنك إعداد أرقام هواتف خيالية للتطوير عبر وحدة تحكم Firebase. يوفر الاختبار باستخدام أرقام هواتف وهمية هذه الفوائد:

  • اختبر مصادقة رقم الهاتف دون استهلاك حصة الاستخدام الخاصة بك.
  • اختبار مصادقة رقم الهاتف دون إرسال رسالة نصية قصيرة فعلية.
  • قم بإجراء اختبارات متتالية باستخدام رقم الهاتف نفسه دون الاختناق. وهذا يقلل من خطر الرفض أثناء عملية مراجعة متجر التطبيقات إذا حدث أن استخدم المراجع نفس رقم الهاتف للاختبار.
  • يمكنك الاختبار بسهولة في بيئات التطوير دون أي جهد إضافي، مثل القدرة على التطوير في محاكي iOS أو محاكي Android بدون خدمات Google Play.
  • قم بكتابة اختبارات التكامل دون أن يتم حظرك بواسطة عمليات التحقق الأمني ​​التي يتم تطبيقها عادةً على أرقام الهواتف الحقيقية في بيئة الإنتاج.

يجب أن تستوفي أرقام الهواتف الوهمية المتطلبات التالية:

  1. تأكد من استخدام أرقام هواتف وهمية بالفعل، وغير موجودة بالفعل. لا تسمح لك مصادقة Firebase بتعيين أرقام الهواتف الحالية التي يستخدمها المستخدمون الحقيقيون كأرقام اختبار. أحد الخيارات هو استخدام 555 رقمًا مسبوقًا كأرقام هواتف اختبارية في الولايات المتحدة، على سبيل المثال: +1 650-555-3434
  2. يجب أن يتم تنسيق أرقام الهواتف بشكل صحيح من حيث الطول والقيود الأخرى. سيستمرون في نفس عملية التحقق من صحة رقم هاتف المستخدم الحقيقي.
  3. يمكنك إضافة ما يصل إلى 10 أرقام هواتف للتطوير.
  4. استخدم أرقام/رموز هواتف اختبارية يصعب تخمينها وقم بتغييرها بشكل متكرر.

إنشاء أرقام هواتف وهمية ورموز التحقق

  1. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  2. في علامة تبويب طريقة تسجيل الدخول ، قم بتمكين موفر الهاتف إذا لم تقم بذلك بالفعل.
  3. افتح قائمة أرقام الهاتف لاختبار الأكورديون.
  4. أدخل رقم الهاتف الذي تريد اختباره، على سبيل المثال: +1 650-555-3434 .
  5. قم بتوفير رمز التحقق المكون من 6 أرقام لهذا الرقم المحدد، على سبيل المثال: 654321 .
  6. أضف الرقم. إذا كانت هناك حاجة، يمكنك حذف رقم الهاتف والرمز الخاص به عن طريق تمرير مؤشر الماوس فوق الصف المقابل والنقر على رمز سلة المهملات.

الاختبار اليدوي

يمكنك البدء مباشرةً باستخدام رقم هاتف وهمي في تطبيقك. يتيح لك هذا إجراء اختبار يدوي أثناء مراحل التطوير دون مواجهة مشكلات الحصص أو التقييد. يمكنك أيضًا الاختبار مباشرةً من محاكي iOS أو محاكي Android دون تثبيت خدمات Google Play.

عند تقديم رقم الهاتف الخيالي وإرسال رمز التحقق، لا يتم إرسال رسائل نصية قصيرة فعلية. وبدلاً من ذلك، يتعين عليك تقديم رمز التحقق الذي تم تكوينه مسبقًا لإكمال تسجيل الدخول.

عند اكتمال تسجيل الدخول، يتم إنشاء مستخدم Firebase باستخدام رقم الهاتف هذا. يتمتع المستخدم بنفس السلوك والخصائص التي يتمتع بها مستخدم رقم الهاتف الحقيقي، ويمكنه الوصول إلى Realtime Database/Cloud Firestore والخدمات الأخرى بنفس الطريقة. رمز المعرف الذي تم سكه أثناء هذه العملية له نفس توقيع مستخدم رقم الهاتف الحقيقي.

هناك خيار آخر يتمثل في تعيين دور اختباري عبر مطالبات مخصصة لهؤلاء المستخدمين لتمييزهم كمستخدمين مزيفين إذا كنت تريد تقييد الوصول بشكل أكبر.

لتشغيل تدفق reCAPTCHA يدويًا للاختبار، استخدم الأسلوب forceRecaptchaFlowForTesting() .

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

اختبار التكامل

بالإضافة إلى الاختبار اليدوي، توفر مصادقة Firebase واجهات برمجة التطبيقات للمساعدة في كتابة اختبارات التكامل لاختبار مصادقة الهاتف. تعمل واجهات برمجة التطبيقات هذه على تعطيل التحقق من التطبيق عن طريق تعطيل متطلبات reCAPTCHA في الويب وإشعارات الدفع الصامتة في نظام التشغيل iOS. وهذا يجعل اختبار الأتمتة ممكنًا في هذه التدفقات وأسهل في التنفيذ. بالإضافة إلى ذلك، فهي تساعد في توفير القدرة على اختبار تدفقات التحقق الفوري على Android.

على Android، اتصل بـ setAppVerificationDisabledForTesting() قبل استدعاء signInWithPhoneNumber . يؤدي هذا إلى تعطيل التحقق من التطبيق تلقائيًا، مما يسمح لك بتمرير رقم الهاتف دون حله يدويًا. على الرغم من تعطيل Play Integrity وreCAPTCHA، فإن استخدام رقم هاتف حقيقي سيظل يفشل في إكمال تسجيل الدخول. يمكن استخدام أرقام الهواتف الخيالية فقط مع واجهة برمجة التطبيقات هذه.

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

يؤدي استدعاء verifyPhoneNumber برقم وهمي إلى تشغيل رد اتصال onCodeSent ، حيث ستحتاج إلى تقديم رمز التحقق المقابل. وهذا يسمح بالاختبار في محاكيات Android.

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)

بالإضافة إلى ذلك، يمكنك اختبار تدفقات الاسترداد التلقائي في Android عن طريق تعيين الرقم الخيالي ورمز التحقق المقابل له للاسترداد التلقائي عن طريق استدعاء setAutoRetrievedSmsCodeForPhoneNumber .

عند استدعاء verifyPhoneNumber ، يتم تشغيل onVerificationCompleted باستخدام PhoneAuthCredential مباشرة. هذا يعمل فقط مع أرقام الهواتف الخيالية.

تأكد من تعطيل هذا وعدم وجود أرقام هواتف وهمية في تطبيقك عند نشر تطبيقك على متجر Google Play.

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)

الخطوات التالية

بعد قيام المستخدم بتسجيل الدخول لأول مرة، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - التي قام المستخدم بتسجيل الدخول بها. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك، ويمكن استخدامه لتحديد المستخدم عبر كل تطبيق في مشروعك، بغض النظر عن كيفية تسجيل دخول المستخدم.

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من كائن FirebaseUser . راجع إدارة المستخدمين .

  • في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير auth ، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود.

لتسجيل خروج مستخدم، اتصل signOut :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();