المصادقة من خلال 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.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")
    }
    

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

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

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

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

تفعيل ميزة "تسجيل الدخول باستخدام رقم الهاتف" لمشروع 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. الحصص في مشروعك. تتوفّر خدمة "الدعم من Google Play" مع الإصدار 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 للتحقق و1 الأسعار.

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

onVerifycomplete(PhoneAuthCredential)

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

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

onVerifyفشل(FirebaseException)

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

onCodeSent(String verificationId, PhoneAuthProvider.ForceRenameingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

هذه السمة اختيارية. ويتم استدعاء هذه الطريقة بعد مدة المهلة المحددة تم تجاوز 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. إجراء الاختبارات باستخدام هاتف وهمي الأرقام التالية:

  • يمكنك اختبار مصادقة رقم الهاتف بدون استهلاك حصة الاستخدام.
  • اختبار مصادقة رقم الهاتف بدون إرسال رسالة 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();