يمكنك استخدام 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:34.11.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:24.0.1") }
- إذا لم يسبق لك ربط تطبيقك بمشروع Firebase، يمكنك إجراء ذلك من Firebase وحدة تحكّم.
- إذا لم يسبق لك ضبط رمز SHA-1 الخاص بتطبيقك في الـ Firebase console، يمكنك إجراء ذلك الآن. يُرجى الاطّلاع على مصادقة العميل للحصول على معلومات حول العثور على رمز SHA-1 الخاص بتطبيقك.
المخاوف المرتبطة بالأمان
تكون المصادقة باستخدام رقم هاتف فقط، على الرغم من أنّها مريحة، أقل أمانًا من الطرق الأخرى المتاحة، لأنّه يمكن بسهولة نقل ملكية رقم الهاتف بين المستخدمين. أيضًا، على الأجهزة التي تتضمّن ملفات شخصية متعددة للمستخدمين، يمكن لأي مستخدم يمكنه تلقّي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم ميزة تسجيل الدخول باستخدام رقم الهاتف في تطبيقك، عليك توفيرها جنبًا إلى جنب مع طرق تسجيل الدخول الأكثر أمانًا، وإعلام المستخدمين بالمخاطر الأمنية لاستخدام ميزة تسجيل الدخول باستخدام رقم الهاتف.
تفعيل ميزة تسجيل الدخول باستخدام رقم الهاتف لمشروع Firebase
لتسجيل دخول المستخدمين عبر رسالة SMS، عليك أولاً تفعيل طريقة تسجيل الدخول باستخدام رقم الهاتف لمشروعك على Firebase:
- في وحدة تحكّم Firebaseconsole، افتح قسم المصادقة.
- في صفحة طريقة تسجيل الدخول ، فعِّل طريقة تسجيل الدخول رقم الهاتف.
- في صفحة الإعدادات ، اضبط سياسة بشأن المناطق التي تريد السماح بإرسال رسائل SMS إليها أو رفض إرسالها إليها. بالنسبة إلى المشاريع الجديدة، لا تسمح السياسة التلقائية بأي مناطق.
تفعيل ميزة التحقّق من التطبيق
لاستخدام ميزة المصادقة باستخدام رقم الهاتف، يجب أن تتمكّن 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 Support مع
Authentication SDK الإصدار 21.2.0 والإصدارات الأحدث
(Firebase BoM الإصدار 31.4.0 والإصدارات الأحدث).
لاستخدام Play Integrity، إذا لم يسبق لك تحديد الملف المرجعي لشهادة SHA-256 الخاصة بتطبيقك، يمكنك إجراء ذلك من إعدادات المشروع في وحدة تحكّم Firebase. يُرجى الرجوع إلى مصادقة العميل للحصول على تفاصيل حول كيفية الحصول على الملف المرجعي لشهادة SHA-256 الخاصة بتطبيقك.
- اختبار التحقّق reCAPTCHA: في حال تعذّر استخدام Play Integrity،
مثلاً عندما يكون لدى المستخدم جهاز غير Google Play services مثبَّت عليه، Firebase Authentication
تستخدم اختبار التحقّق reCAPTCHA لإكمال طريقة تسجيل الدخول باستخدام رقم الهاتف. يمكن في كثير من الأحيان إكمال تحدّي reCAPTCHA
بدون أن يضطر المستخدم إلى حلّ أي شيء. يُرجى العِلم أنّ هذه الطريقة تتطلّب ربط رمز SHA-1 بتطبيقك. تتطلّب هذه الطريقة أيضًا أن يكون مفتاح واجهة برمجة التطبيقات غير مقيّد أو أن يكون مدرجًا في القائمة المسموح بها لـ
PROJECT_ID.firebaseapp.com.بعض السيناريوهات التي يتم فيها تفعيل reCAPTCHA:
- إذا لم يكن جهاز المستخدم النهائي مثبَّتًا عليه Google Play services.
- إذا لم يتم توزيع التطبيق من خلال Google Play Store (على Authentication SDK v21.2.0+).
- إذا لم يكن رمز SafetyNet الذي تم الحصول عليه صالحًا (على إصدارات حزمة تطوير البرامج (SDK) Authentication الأقل من الإصدار 21.2.0).
عند استخدام SafetyNet أو Play Integrity للتحقّق من التطبيق، يتم ملء الحقل
%APP_NAME%في نموذج رسالة SMS باسم التطبيق الذي تم تحديده من Google Play Store. في السيناريوهات التي يتم فيها تفعيل reCAPTCHA، يتم ملء%APP_NAME%على النحوPROJECT_ID.firebaseapp.com.
forceRecaptchaFlowForTesting
يمكنك إيقاف ميزة التحقّق من التطبيق (عند استخدام أرقام هواتف وهمية) باستخدام
setAppVerificationDisabledForTesting.
تحديد المشاكل وحلّها
الخطأ "Missing initial state" عند استخدام 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 في مثيل Auth.
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 الواردة للتحقّق من الهوية تلقائيًا وإجراء عملية التحقّق بدون اتخاذ أي إجراء من جانب المستخدم. (قد لا تتوفّر هذه الإمكانية لدى بعض مشغّلي شبكات الجوّال). تستخدم هذه الميزة واجهة برمجة التطبيقات 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 فعلية.
- إجراء اختبارات متتالية باستخدام رقم الهاتف نفسه بدون أن يتم تقييدك. يقلّل ذلك من خطر الرفض أثناء عملية مراجعة App Store إذا استخدم المراجع رقم الهاتف نفسه للاختبار.
- الاختبار بسهولة في بيئات التطوير بدون أي جهد إضافي، مثل إمكانية التطوير في محاكي iOS أو محاكي Android بدون "خدمات Google Play".
- كتابة اختبارات التكامل بدون أن يتم حظرها من خلال عمليات الفحص الأمني التي يتم تطبيقها عادةً على أرقام الهواتف الحقيقية في بيئة الإنتاج.
يجب أن تستوفي أرقام الهواتف الوهمية المتطلبات التالية:
- تأكَّد من استخدام أرقام هواتف وهمية بالفعل وغير موجودة حاليًا. Firebase Authentication لا تسمح لك بضبط أرقام الهواتف الحالية التي يستخدمها مستخدمون حقيقيون كأرقام اختبار. أحد الخيارات هو استخدام أرقام تبدأ بـ 555 كأرقام هواتف اختبار في الولايات المتحدة، مثلاً: +1 650-555-3434
- يجب تنسيق أرقام الهواتف بشكلٍ صحيح من حيث الطول والقيود الأخرى ستظل تخضع لعملية التحقّق نفسها التي يخضع لها رقم هاتف المستخدم الحقيقي.
- يمكنك إضافة ما يصل إلى 10 أرقام هواتف للتطوير.
- استخدِم أرقام هواتف/رموز اختبار يصعب تخمينها وغيِّر ها بشكلٍ متكرر.
إنشاء أرقام هواتف وهمية ورموز تحقّق
- في وحدة تحكّم Firebase، افتح قسم المصادقة.
- في علامة التبويب طريقة تسجيل الدخول ، فعِّل موفِّر الهاتف إذا لم يسبق لك إجراء ذلك.
- افتح قائمة الأكورديون أرقام الهواتف للاختبار.
- قدِّم رقم الهاتف الذي تريد اختباره، مثلاً: +1 650-555-3434.
- قدِّم رمز التحقّق المكوّن من 6 أرقام لهذا الرقم تحديدًا، مثلاً: 654321.
- انقر على إضافة الرقم. إذا لزم الأمر، يمكنك حذف رقم الهاتف و الرمز الخاص به من خلال تمرير مؤشر الماوس فوق الصف المقابل والنقر على رمز سلة المهملات.
الاختبار اليدوي
يمكنك البدء مباشرةً باستخدام رقم هاتف وهمي في تطبيقك. يتيح لك ذلك إجراء اختبار يدوي أثناء مراحل التطوير بدون مواجهة مشاكل في الحصة أو التقييد. يمكنك أيضًا إجراء الاختبار مباشرةً من محاكي iOS أو محاكي Android بدون تثبيت "خدمات Google Play".
عند تقديم رقم الهاتف الوهمي وإرسال رمز التحقّق، لا يتم إرسال أي رسالة SMS فعلية. بدلاً من ذلك، عليك تقديم رمز التحقّق الذي تم ضبطه سابقًا لإكمال عملية تسجيل الدخول.
عند اكتمال عملية تسجيل الدخول، يتم إنشاء حساب مستخدم على 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 Store.
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();