يمكنك استخدام Firebase Authentication لتسجيل دخول مستخدم من خلال إرسال رسالة SMS إلى هاتف المستخدم. يسجّل المستخدم الدخول باستخدام رمز يُستخدم لمرة واحدة وارد في رسالة SMS.
أسهل طريقة لإضافة ميزة تسجيل الدخول باستخدام رقم الهاتف إلى تطبيقك هي استخدام FirebaseUI، الذي يتضمّن تطبيقًا مصغّرًا لتسجيل الدخول يتيح تنفيذ عمليات تسجيل الدخول باستخدام رقم الهاتف، بالإضافة إلى تسجيل الدخول المستند إلى كلمة المرور وتسجيل الدخول الموحّد. يوضّح هذا المستند كيفية تنفيذ عملية تسجيل الدخول باستخدام رقم الهاتف من خلال Firebase SDK.
قبل البدء
- أضِف Firebase إلى مشروع Android الخاص بك، في حال لم يسبق لك إجراء ذلك.
-
في ملف Gradle للوحدة (على مستوى التطبيق)
(عادةً
<project>/<app-module>/build.gradle.ktsأو<project>/<app-module>/build.gradle)، أضِف الاعتمادية لمكتبة Firebase Authentication لنظام التشغيل Android. ننصح باستخدام Firebase Android BoM للتحكّم في إصدارات المكتبة.dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:35.1.0")) // 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:25.0.0") }
- إذا لم يسبق لك ربط تطبيقك بمشروع Firebase، يمكنك إجراء ذلك من خلال وحدة تحكّم Firebase.
- إذا لم يسبق لك ضبط تجزئة SHA-1 لتطبيقك في وحدة تحكّم Firebase، عليك إجراء ذلك. يمكنك الاطّلاع على مصادقة العميل للحصول على معلومات حول العثور على تجزئة SHA-1 لتطبيقك.
المخاوف المرتبطة بالأمان
إنّ المصادقة باستخدام رقم الهاتف فقط، على الرغم من سهولتها، أقل أمانًا من الطرق الأخرى المتاحة، لأنّ ملكية رقم الهاتف يمكن نقلها بسهولة بين المستخدمين. بالإضافة إلى ذلك، على الأجهزة التي تتضمّن ملفات شخصية متعددة للمستخدمين، يمكن لأي مستخدم يمكنه تلقّي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك، فيجب عليك تقديمه إلى جانب طرق تسجيل الدخول الأكثر أمانًا، وإبلاغ المستخدمين بالمفاضلات الأمنية لاستخدام تسجيل الدخول برقم الهاتف.
تفعيل ميزة تسجيل الدخول باستخدام رقم الهاتف في مشروع Firebase
لتسجيل دخول المستخدمين عبر الرسائل القصيرة، عليك أولاً تفعيل طريقة تسجيل الدخول برقم الهاتف لمشروع Firebase:
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر خدمة تسجيل الدخول باستخدام الهاتف.
-
يمكنك ضبط سياسة على المناطق التي تريد السماح بإرسال رسائل SMS إليها أو رفضها. يمكن أن يساعد ضبط سياسة منطقة الرسائل القصيرة في حماية
تطبيقاتك من إساءة استخدام الرسائل القصيرة. بالنسبة إلى المشاريع الجديدة، لا تسمح السياسة التلقائية بأي مناطق.
- في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب الأمان > المصادقة > الإعدادات.
- في قسم سياسة منطقة الرسائل القصيرة، اضبط سياسة منطقة الرسائل القصيرة.
تفعيل ميزة "التحقّق من التطبيقات"
لاستخدام مصادقة رقم الهاتف، يجب أن يتمكّن Firebase من التحقّق من أنّ طلبات تسجيل الدخول برقم الهاتف واردة من تطبيقك. هناك ثلاث طرق يحقّق بها Firebase Authentication ذلك:
- Play Integrity API: إذا كان لدى المستخدم جهاز مثبَّت عليه "Google Play services"،
ويمكن لـ "Firebase Authentication" التحقّق من أنّ الجهاز شرعي باستخدام
Play Integrity API،
يمكن متابعة تسجيل الدخول باستخدام رقم الهاتف. تم تفعيل واجهة Play Integrity API في مشروع تملكه Google من قِبل
Firebase Authentication، وليس في مشروعك. ولا يساهم ذلك في أي حصص لواجهة Play Integrity API في مشروعك. يتوفّر دعم Play Integrity مع
الإصدار 21.2.0 أو الإصدارات الأحدث من حزمة تطوير البرامج (SDK) لـ Authentication
(الإصدار 31.4.0 أو الإصدارات الأحدث من Firebase BoM).
لاستخدام Play Integrity، حدِّد الملف المرجعي لشهادة SHA-256 الخاصة بتطبيقك إذا لم يسبق لك إجراء ذلك.
-
في وحدة تحكّم "Firebase"، انتقِل إلى
الإعدادات > علامة التبويب الإعدادات العامة. - انتقِل للأسفل وصولاً إلى بطاقة تطبيقاتك، واختَر تطبيق Android، ثم أضِف الملف المرجعي لشهادة SHA-256 في حقل الملفات المرجعية لشهادة SHA.
يمكنك الاطّلاع على مصادقة العميل لمعرفة تفاصيل حول كيفية الحصول على الملف المرجعي لشهادة SHA لتطبيقك.
-
في وحدة تحكّم "Firebase"، انتقِل إلى
- اختبار التحقّق reCAPTCHA: في حال تعذّر استخدام Play Integrity،
مثلاً عندما يكون لدى المستخدم جهاز غير مثبَّت عليه Google Play services، يستخدم Firebase Authentication
اختبار التحقّق reCAPTCHA لإكمال عملية تسجيل الدخول باستخدام رقم الهاتف. ويمكن في كثير من الأحيان إكمال تحدّي reCAPTCHA بدون أن يضطر المستخدم إلى حلّ أي مسألة. يُرجى العِلم أنّ هذا الإجراء يتطلّب
ربط SHA-1 بتطبيقك. تتطلّب هذه العملية أيضًا أن يكون مفتاح واجهة برمجة التطبيقات
غير مقيّد أو مدرَجًا في القائمة المسموح بها لـ
PROJECT_ID.firebaseapp.com.في ما يلي بعض السيناريوهات التي يتم فيها تفعيل reCAPTCHA:
- إذا لم يكن تطبيق "Google Play services" مثبّتًا على جهاز المستخدم النهائي
- إذا لم يتم توزيع التطبيق من خلال "Google Play Store" (على الإصدار 21.2.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لـ "Authentication")
- إذا لم يكن رمز SafetyNet المميّز الذي تم الحصول عليه صالحًا (في إصدارات حزمة تطوير البرامج (SDK) من Authentication الأقدم من 21.2.0).
عند استخدام SafetyNet أو Play Integrity للتحقّق من التطبيق، تتم تعبئة الحقل
%APP_NAME%في نموذج الرسائل القصيرة باسم التطبيق الذي تم تحديده من Google Play Store. في السيناريوهات التي يتم فيها تفعيل reCAPTCHA، تتم تعبئة%APP_NAME%على أنّهاPROJECT_ID.firebaseapp.com.
forceRecaptchaFlowForTesting
يمكنك إيقاف التحقق من التطبيقات (عند استخدام أرقام هواتف وهمية) باستخدام
setAppVerificationDisabledForTesting.
تحديد المشاكل وحلّها
ظهور الخطأ "الحالة الأولية غير متوفّرة" عند استخدام reCAPTCHA للتحقّق من التطبيقات
يمكن أن يحدث ذلك عند اكتمال عملية reCAPTCHA بنجاح ولكن لا تتم إعادة توجيه المستخدم إلى التطبيق الأصلي. في هذه الحالة، تتم إعادة توجيه المستخدم إلى عنوان URL الاحتياطي
PROJECT_ID.firebaseapp.com/__/auth/handler. في متصفّحات Firefox، يكون فتح روابط التطبيقات الأصلية غير مفعَّل تلقائيًا. إذا ظهر لك الخطأ أعلاه في Firefox، اتّبِع الخطوات الواردة في مقالة ضبط Firefox لنظام التشغيل Android لفتح الروابط في التطبيقات الأصلية لتفعيل فتح روابط التطبيقات.
إرسال رمز تحقّق إلى هاتف المستخدم
لبدء تسجيل الدخول باستخدام رقم الهاتف، اعرض للمستخدم واجهة تطلب منه كتابة رقم هاتفه. تختلف المتطلبات القانونية، ولكن كأفضل ممارسة ولتحديد التوقعات للمستخدمين، يجب إبلاغهم بأنهم إذا استخدموا تسجيل الدخول عبر الهاتف، فقد يتلقون رسالة SMS للتحقق من الهوية ويتم تطبيق الأسعار العادية.
بعد ذلك، مرِّر رقم الهاتف إلى طريقة
PhoneAuthProvider.verifyPhoneNumber لطلب تحقُّق Firebase
من رقم هاتف المستخدم. على سبيل المثال:
Kotlin
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
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
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 API، التي تتضمّن تجزئة من 11 حرفًا في نهاية الرسالة القصيرة SMS.
PhoneAuthCredential الذي تم تمريره إلى
عملية الاستدعاء من أجل تسجيل دخول المستخدم.
onVerificationFailed(FirebaseException)
يتم استدعاء هذه الطريقة استجابةً لطلب تحقّق غير صالح، مثل طلب يحدّد رقم هاتف أو رمز تحقّق غير صالح.
onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)
اختياريّ. يتم استدعاء هذه الطريقة بعد إرسال رمز التحقّق عبر رسالة قصيرة SMS إلى رقم الهاتف المقدَّم.
عند استدعاء هذه الطريقة، تعرض معظم التطبيقات واجهة مستخدم تطلب من المستخدم كتابة رمز التحقّق من رسالة SMS. (في الوقت نفسه، قد يتم إجراء عملية إثبات الملكية التلقائي في الخلفية). بعد ذلك، عندما يكتب المستخدم رمز التحقّق، يمكنك استخدام رمز التحقّق ورقم تعريف التحقّق اللذين تم تمريرهما إلى الطريقة لإنشاء عنصر PhoneAuthCredential، والذي يمكنك استخدامه بدوره لتسجيل دخول المستخدم. ومع ذلك، قد تنتظر بعض التطبيقات حتى يتم استدعاء onCodeAutoRetrievalTimeOut قبل عرض واجهة مستخدم رمز التحقّق (لا يُنصح بذلك).
onCodeAutoRetrievalTimeOut(String verificationId)
اختياريّ. يتم استدعاء هذه الطريقة بعد انقضاء مدة المهلة المحدّدة لـ verifyPhoneNumber بدون تفعيل onVerificationCompleted أولاً. على الأجهزة التي لا تحتوي على شرائح SIM، يتم استدعاء هذه الطريقة على الفور لأنّ الاسترداد التلقائي لرسائل SMS غير ممكن.
تحظر بعض التطبيقات إدخال المستخدم إلى أن تنتهي مهلة التحقّق التلقائي، وعندئذٍ فقط تعرض واجهة مستخدم تطلب من المستخدم كتابة رمز التحقّق من رسالة SMS (لا يُنصح بذلك).
إنشاء عنصر PhoneAuthCredential
بعد أن يُدخل المستخدم رمز التحقّق الذي أرسلته Firebase إلى هاتف المستخدم، أنشئ عنصر PhoneAuthCredential باستخدام رمز التحقّق ومعرّف التحقّق الذي تم تمريره إلى دالة الاستدعاء onCodeSent أو onCodeAutoRetrievalTimeOut. (عند استدعاء onVerificationCompleted، تحصل على عنصر PhoneAuthCredential مباشرةً، لذا يمكنك تخطّي هذه الخطوة).
لإنشاء عنصر PhoneAuthCredential، استخدِم
PhoneAuthProvider.getCredential:
Kotlin
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
تسجيل دخول المستخدم
بعد الحصول على عنصر PhoneAuthCredential، سواء في دالة رد الاتصال onVerificationCompleted أو من خلال استدعاء PhoneAuthProvider.getCredential، يمكنك إكمال عملية تسجيل الدخول من خلال تمرير عنصر PhoneAuthCredential إلى FirebaseAuth.signInWithCredential:
Kotlin
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 Emulator بدون "خدمات Google Play".
- كتابة اختبارات التكامل بدون أن يتم حظرها من خلال عمليات التحقّق من الأمان التي يتم تطبيقها عادةً على أرقام الهواتف الحقيقية في بيئة التشغيل الفعلي
يجب أن تستوفي أرقام الهواتف الخيالية المتطلبات التالية:
- تأكَّد من استخدام أرقام هواتف وهمية وغير موجودة حاليًا. لا يسمح لك Firebase Authentication بضبط أرقام الهواتف الحالية التي يستخدمها مستخدمون حقيقيون كأرقام اختبارية. من بين الخيارات المتاحة استخدام أرقام تبدأ بـ 555 كأرقام هواتف اختبارية في الولايات المتحدة، على سبيل المثال: +1 650-555-3434
- يجب أن تكون أرقام الهواتف منسَّقة بشكل صحيح من حيث الطول والقيود الأخرى. وسيتم التحقّق من صحتها بالطريقة نفسها التي يتم بها التحقّق من صحة رقم هاتف مستخدم حقيقي.
- يمكنك إضافة ما يصل إلى 10 أرقام هواتف لأغراض التطوير.
- استخدِم أرقام هواتف أو رموزًا تجريبية يصعب تخمينها وغيِّرها بشكل متكرر.
إنشاء أرقام هواتف ورموز تحقّق وهمية
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول (Sign-in method)، فعِّل مزوّد خدمة تسجيل الدخول الهاتف (Phone) إذا لم يسبق لك تفعيله.
- وسِّع قسم أرقام الهواتف المخصّصة للاختبار.
-
أدخِل رقم الهاتف الذي تريد اختباره، على سبيل المثال:
+1 650-555-3434. -
أدخِل رمز التحقّق المكوّن من 6 أرقام لهذا الرقم المحدّد، على سبيل المثال:
654321. - انقر على إضافة لكل رقم. إذا لزم الأمر، يمكنك حذف رقم الهاتف والرمز الخاص به من خلال تمرير مؤشر الماوس فوق الصف المقابل والنقر على رمز المهملات.
الاختبار اليدوي
يمكنك البدء مباشرةً في استخدام رقم هاتف وهمي في تطبيقك. يتيح لك ذلك إجراء اختبارات يدوية خلال مراحل التطوير بدون مواجهة مشاكل في الحصص أو تقييد السرعة. يمكنك أيضًا إجراء الاختبار مباشرةً من محاكي iOS أو Android Emulator بدون تثبيت "خدمات Google Play".
عند تقديم رقم الهاتف الوهمي وإرسال رمز التحقّق، لا يتم إرسال أي رسالة قصيرة فعلية. بدلاً من ذلك، عليك تقديم رمز التحقّق الذي تم ضبطه مسبقًا لإكمال عملية تسجيل الدخول.
عند اكتمال تسجيل الدخول، يتم إنشاء مستخدم Firebase باستخدام رقم الهاتف هذا. يتمتع المستخدم بالسلوك والخصائص نفسها التي يتمتع بها مستخدم رقم الهاتف الحقيقي، ويمكنه الوصول إلى Realtime Database/Cloud Firestore والخدمات الأخرى بالطريقة نفسها. ويحمل الرمز المميّز للمعرّف الذي تم إنشاؤه خلال هذه العملية التوقيع نفسه الذي يحمله مستخدم رقم هاتف حقيقي.
هناك خيار آخر وهو ضبط دور اختبار من خلال المطالبات المخصّصة لهؤلاء المستخدمين لتمييزهم كمستخدمين مزيّفين إذا أردت فرض قيود إضافية على الوصول.
لتشغيل عملية reCAPTCHA يدويًا لأغراض الاختبار، استخدِم الطريقة forceRecaptchaFlowForTesting().
// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
اختبار التكامل
بالإضافة إلى الاختبار اليدوي، يوفّر Firebase Authentication واجهات برمجة تطبيقات للمساعدة في كتابة اختبارات التكامل لاختبار المصادقة عبر الهاتف. تؤدي واجهات برمجة التطبيقات هذه إلى إيقاف ميزة "التحقّق من التطبيقات" من خلال إيقاف متطلبات 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
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
// 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 Database وCloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر
auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام عدة مقدّمي خدمات مصادقة من خلال ربط بيانات اعتماد مقدّم خدمة المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم، يمكنك استدعاء
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();