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

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

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

قبل البدء

  1. أضِف Firebase إلى مشروع Android إذا لم يسبق لك إجراء ذلك.
  2. في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle)، أضِف الاعتمادية لمكتبة مصادقة Firebase لنظام التشغيل Android. ننصح باستخدام بنود سياسة Android في Firebase للتحكّم في نُسَخ المكتبة.
    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")
    }
    

    باستخدام أداة إدارة قوائم التشغيل Android في Firebase، سيستخدم تطبيقك دائمًا الإصدارات المتوافقة من مكتبات Android في Firebase.

    (بديل) إضافة ملحقات مكتبة Firebase بدون استخدام BoM

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

المخاوف المرتبطة بالأمان

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

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

تفعيل ميزة "تسجيل الدخول باستخدام رقم الهاتف" لمشروع Firebase

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

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

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

تفعيل التحقق من التطبيقات

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

  • واجهة برمجة التطبيقات Play Integrity API: إذا كان المستخدم لديه جهاز تم تثبيت "خدمات Google Play" عليه، وتمكّنت "مصادقة Firebase" من التأكّد من سلامة الجهاز باستخدام Play Integrity API، يمكن مواصلة عملية تسجيل الدخول إلى رقم الهاتف. يتم تفعيل واجهة برمجة التطبيقات Play Integrity API في مشروع تملكه Google من خلال مصادقة Firebase، وليس في مشروعك. لا يساهم ذلك في احتساب أي حصص لواجهة برمجة التطبيقات Play Integrity API في مشروعك. يتوفّر دعم Play Integrity Support مع الإصدار 21.2.0 من حزمة تطوير البرامج (SDK) للمصادقة أو الإصدارات الأحدث (الإصدار 31.4.0 أو الإصدارات الأحدث من Firebase BoM).

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

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

    في ما يلي بعض الحالات التي يتم فيها تشغيل reCAPTCHA:

    عند استخدام SafetyNet أو Play Integrity لإثبات ملكية التطبيقات، تتم تعبئة الحقل %APP_NAME% في نموذج الرسائل القصيرة SMS باسم التطبيق الذي تم تحديده من "متجر 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 لفتح الروابط في التطبيقات الأصلية لتفعيل فتح روابط التطبيقات.

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

لبدء تسجيل الدخول إلى رقم الهاتف، اعرض للمستخدم واجهة تطلب منه كتابة رقم هاتفه. تختلف المتطلبات القانونية، ولكن وفقًا لأفضل الممارسات ولتحديد التوقعات للمستخدمين، يجب إبلاغهم بأنّه في حال تسجيل الدخول عبر الهاتف، قد يتلقّون رسالة قصيرة (SMS) لإثبات الملكية وسيتم تطبيق الأسعار العادية.

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

يمكنك استخدام هذا السلوك لاستئناف عملية تسجيل الدخول إلى رقم الهاتف في حال إغلاق التطبيق قبل أن يتمكّن المستخدم من تسجيل الدخول (على سبيل المثال، في حال استخدام تطبيق الرسائل القصيرة 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، وفقًا لمتطلبات تطبيقك.

onVerifycomplete(PhoneAuthCredential)

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

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

onVerifyفشل(FirebaseException)

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

onCodeSent(String verificationId, PhoneAuthProvider.ForceRenameingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

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

تحظر بعض التطبيقات البيانات التي يُدخلها المستخدم إلى أن تنتهي مهلة التحقّق التلقائي، ثم تعرض فقط واجهة مستخدم تطلب من المستخدم كتابة رمز التحقّق من الرسالة القصيرة (لا يُنصح بهذا الإجراء).

إنشاء كائن 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. يوفر الاختبار باستخدام أرقام الهاتف الخيالية المزايا التالية:

  • يمكنك اختبار مصادقة رقم الهاتف بدون استهلاك حصة الاستخدام.
  • اختبار مصادقة رقم الهاتف بدون إرسال رسالة SMS فعلية.
  • يمكنك إجراء اختبارات متتالية باستخدام رقم الهاتف نفسه بدون تقييد. ويقلّل ذلك من خطر الرفض أثناء عملية مراجعة متجر التطبيقات إذا تصادف أن يستخدم المُراجع رقم الهاتف نفسه للاختبار.
  • يمكنك الاختبار بسهولة في بيئات التطوير بدون أي جهد إضافي، مثل القدرة على التطوير باستخدام محاكي 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".

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

عند اكتمال تسجيل الدخول، يتم إنشاء مستخدم Firebase برقم الهاتف هذا. يمتاز المستخدم بالسلوك والخصائص نفسها التي يستخدمها مستخدم رقم هاتف حقيقي، ويمكنه الوصول إلى قاعدة بيانات الوقت الفعلي/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 في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج مستخدم، يمكنك الاتصال بالرقم signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();