يمكنك استخدام مصادقة Firebase لتسجيل دخول مستخدم عن طريق إرسال رسالة SMS إلى هاتف المستخدم. يقوم المستخدم بتسجيل الدخول باستخدام رمز يستخدم لمرة واحدة موجود في رسالة SMS.
تتمثل أسهل طريقة لإضافة تسجيل الدخول برقم الهاتف إلى تطبيقك في استخدام FirebaseUI ، والذي يتضمن أداة تسجيل الدخول التي تعمل على تسجيل الدخول والتي تنفذ تدفقات تسجيل الدخول لتسجيل الدخول إلى رقم الهاتف ، بالإضافة إلى تسجيل الدخول المستند إلى كلمة المرور والتسجيل الموحد -في. يصف هذا المستند كيفية تنفيذ تدفق تسجيل الدخول إلى رقم الهاتف باستخدام Firebase SDK.
قبل ان تبدأ
- أضف Firebase إلى مشروع Android ، إذا لم تكن قد قمت بذلك بالفعل.
- في ملف Gradle (على مستوى التطبيق) للوحدة النمطية (عادةً ما يكون
<project>/<app-module>/build.gradle
) ، أضف تبعية مكتبة Firebase Authentication Android. نوصي باستخدام Firebase Android BoM للتحكم في إصدارات المكتبة.Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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-ktx' }
باستخدام 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-ktx:21.1.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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:21.1.0' }
- إذا لم تكن قد ربطت تطبيقك بمشروع Firebase حتى الآن ، فافعل ذلك من وحدة تحكم Firebase .
- إذا لم تكن قد قمت بالفعل بتعيين تجزئة SHA-1 لتطبيقك في وحدة تحكم Firebase ، فافعل ذلك. راجع مصادقة عميلك للحصول على معلومات حول العثور على تجزئة SHA-1 لتطبيقك.
مخاوف أمنية
المصادقة باستخدام رقم هاتف فقط ، على الرغم من ملاءمتها ، إلا أنها أقل أمانًا من الطرق الأخرى المتاحة ، لأن حيازة رقم هاتف يمكن نقلها بسهولة بين المستخدمين. أيضًا ، على الأجهزة ذات ملفات تعريف المستخدمين المتعددة ، يمكن لأي مستخدم يمكنه تلقي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك ، فيجب أن تقدمه جنبًا إلى جنب مع طرق تسجيل دخول أكثر أمانًا ، وإبلاغ المستخدمين بالمقايضات الأمنية باستخدام تسجيل الدخول برقم الهاتف.
تفعيل تسجيل الدخول إلى رقم الهاتف لمشروع Firebase
لتسجيل دخول المستخدمين عن طريق الرسائل القصيرة SMS ، يجب أولاً تمكين طريقة تسجيل الدخول إلى رقم الهاتف لمشروع Firebase:
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في صفحة طريقة تسجيل الدخول ، قم بتمكين طريقة تسجيل الدخول برقم الهاتف .
الحصة النسبية لطلبات تسجيل الدخول إلى رقم هاتف Firebase عالية بما يكفي لعدم تأثر معظم التطبيقات. ومع ذلك ، إذا كنت بحاجة إلى تسجيل دخول عدد كبير جدًا من المستخدمين باستخدام مصادقة الهاتف ، فقد تحتاج إلى ترقية خطة التسعير الخاصة بك. انظر صفحة التسعير .
تفعيل التحقق من التطبيق
لاستخدام مصادقة رقم الهاتف ، يجب أن يكون Firebase قادرًا على التحقق من أن طلبات تسجيل الدخول إلى رقم الهاتف واردة من تطبيقك. هناك طريقتان لإنجاز Firebase Authentication:
- SafetyNet : إذا كان لدى المستخدم جهاز مثبت عليه خدمات Google Play ، ويمكن لمصادقة Firebase التحقق من أن الجهاز شرعي باستخدام Android SafetyNet ، فيمكن متابعة تسجيل الدخول إلى رقم الهاتف.
- في Google Cloud Console ، قم بتمكين واجهة برمجة تطبيقات التحقق من جهاز Android (DEPRECATED) لمشروعك. سيتم استخدام مفتاح Firebase API الافتراضي ، ويلزم السماح له بالوصول إلى واجهة برمجة تطبيقات DeviceCheck.
- إذا لم تكن قد حددت بصمة إصبع SHA-256 لتطبيقك ، فقم بذلك من صفحة الإعدادات في وحدة تحكم Firebase. راجع مصادقة عميلك للحصول على تفاصيل حول كيفية الحصول على بصمة SHA-256 لتطبيقك.
- التحقق من reCAPTCHA : في حالة عدم إمكانية استخدام SafetyNet ، مثل عندما لا يكون لدى المستخدم دعم خدمات Google Play ، أو عند اختبار تطبيقك على محاكي ، تستخدم مصادقة Firebase التحقق من reCAPTCHA لإكمال تدفق تسجيل الدخول عبر الهاتف. غالبًا ما يمكن إكمال اختبار reCAPTCHA دون أن يضطر المستخدم إلى حل أي شيء. يرجى ملاحظة أن هذا التدفق يتطلب أن يكون SHA-1 مرتبطًا بتطبيقك. يتطلب هذا التدفق أيضًا أن يكون مفتاح واجهة برمجة التطبيقات غير مقيد أو مسموح به لـ "$ {PROJECT_NAME} .firebaseapp.com".
لتمكين SafetyNet للاستخدام مع مصادقة Firebase:
أرسل رمز التحقق إلى هاتف المستخدم
لبدء تسجيل الدخول إلى رقم الهاتف ، قدم للمستخدم واجهة تطالبه بكتابة رقم هاتفه. تختلف المتطلبات القانونية ، ولكن كأفضل ممارسة ولتحديد التوقعات للمستخدمين ، يجب عليك إبلاغهم بأنهم إذا استخدموا تسجيل الدخول عبر الهاتف ، فقد يتلقون رسالة 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) // Activity (for callback binding) .setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks .build(); PhoneAuthProvider.verifyPhoneNumber(options);
يتم إعادة إدخال طريقة التحقق من رقم الهاتف: إذا اتصلت بها عدة مرات ، كما هو الحال في طريقة
verifyPhoneNumber
الخاصةonStart
ما ، فلن ترسل طريقةverifyPhoneNumber
من رقم الهاتف رسالة نصية قصيرة ثانية إلا إذا انقضت مهلة الطلب الأصلي.يمكنك استخدام هذا السلوك لاستئناف عملية تسجيل الدخول إلى رقم الهاتف إذا تم إغلاق تطبيقك قبل أن يتمكن المستخدم من تسجيل الدخول (على سبيل المثال ، أثناء استخدام المستخدم لتطبيق الرسائل القصيرة). بعد الاتصال
verifyPhoneNumber
، قم بتعيين علامة تشير إلى أن التحقق قيد التقدم. بعد ذلك ، احفظ العلامة في طريقةonSaveInstanceState
الخاصة بنشاطك واستعد العلامة فيonRestoreInstanceState
. أخيرًا ، في طريقةonStart
الخاصة بنشاطك ، تحقق مما إذا كان التحقق قيد التقدم بالفعل ، وإذا كان الأمر كذلك ، فاتصلverifyPhoneNumber
مرة أخرى. تأكد من مسح العلم عند اكتمال التحقق أو فشله (انظر عمليات رد الاتصال للتحقق ).للتعامل بسهولة مع تدوير الشاشة وحالات إعادة تشغيل النشاط الأخرى ، مرر نشاطك إلى طريقة
verifyPhoneNumber
من رقم الهاتف. سيتم فصل عمليات الاسترجاعات تلقائيًا عند توقف النشاط ، بحيث يمكنك كتابة رمز انتقال واجهة المستخدم بحرية في طرق رد الاتصال.يمكن أيضًا ترجمة رسالة SMS التي أرسلها Firebase عن طريق تحديد لغة المصادقة عبر طريقة
setLanguageCode
على مثيل Auth الخاص بك.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 } // 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 } // 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. (في الوقت نفسه ، قد يستمر التحقق التلقائي في الخلفية.) بعد ذلك ، بعد أن يكتب المستخدم رمز التحقق ، يمكنك استخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلى الطريقة لإنشاء كائن
PhoneAuthCredential
، والذي يمكنك بدورها استخدامها لتسجيل دخول المستخدم. ومع ذلك ، قد تنتظر بعض التطبيقات حتى يتم استدعاءonCodeAutoRetrievalTimeOut
قبل عرض رمز التحقق UI (غير مستحسن).onCodeAutoRetrievalTimeOut (معرف التحقق من السلسلة)
اختياري. يتم استدعاء هذا الأسلوب بعد انقضاء مدة المهلة المحددة للتحقق من رقم الهاتف دون
onVerificationCompleted
verifyPhoneNumber
. على الأجهزة التي لا تحتوي على بطاقات SIM ، يتم استدعاء هذه الطريقة على الفور لأن الاسترداد التلقائي للرسائل القصيرة غير ممكن.تحظر بعض التطبيقات إدخال المستخدم حتى تنتهي مهلة التحقق التلقائي ، وعندها فقط تعرض واجهة مستخدم تطالب المستخدم بكتابة رمز التحقق من رسالة SMS (غير مستحسن).
قم بإنشاء كائن PhoneAuthCredential
بعد أن يقوم المستخدم بإدخال رمز التحقق الذي أرسله Firebase إلى هاتف المستخدم ، قم بإنشاء كائن
PhoneAuthCredential
، باستخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلىonCodeSent
أوonCodeAutoRetrievalTimeOut
callback. (عند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.
- اكتب اختبارات التكامل دون أن تمنعك فحوصات الأمان التي تُطبق عادةً على أرقام الهواتف الحقيقية في بيئة الإنتاج.
يجب أن تستوفي أرقام الهواتف الخيالية المتطلبات التالية:
- تأكد من استخدام أرقام هواتف خيالية بالفعل وغير موجودة بالفعل. لا تسمح لك مصادقة Firebase بتعيين أرقام الهواتف الحالية التي يستخدمها المستخدمون الحقيقيون كأرقام اختبار. أحد الخيارات هو استخدام 555 رقمًا مسبوقًا كأرقام هواتف تجريبية في الولايات المتحدة ، على سبيل المثال: +1 650-555-3434
- يجب تنسيق أرقام الهواتف بشكل صحيح وفقًا للطول والقيود الأخرى. سيستمرون في إجراء نفس التحقق من صحة رقم هاتف المستخدم الحقيقي.
- يمكنك إضافة ما يصل إلى 10 أرقام هواتف للتطوير.
- استخدم أرقام هواتف / أكواد اختبارية يصعب تخمينها وقم بتغييرها بشكل متكرر.
قم بإنشاء أرقام هواتف ورموز تحقق خيالية
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر الهاتف إذا لم تكن قد قمت بذلك بالفعل.
- افتح قائمة أرقام الهواتف لاختبار الأكورديون.
- أدخل رقم الهاتف الذي تريد اختباره ، على سبيل المثال: 3434-555-555 +1 650 .
- قدم رمز التحقق المكون من 6 أرقام لهذا الرقم المحدد ، على سبيل المثال: 654321 .
- أضف الرقم. إذا كانت هناك حاجة ، يمكنك حذف رقم الهاتف ورمزه بالمرور فوق الصف المقابل والنقر فوق أيقونة سلة المهملات.
الاختبار اليدوي
يمكنك البدء مباشرة في استخدام رقم هاتف وهمي في تطبيقك. يتيح لك ذلك إجراء اختبار يدوي أثناء مراحل التطوير دون التعرض لمشكلات في الحصة النسبية أو تقييدها. يمكنك أيضًا الاختبار مباشرة من محاكي iOS أو محاكي Android بدون تثبيت خدمات Google Play.
عندما تقدم رقم الهاتف الوهمي وترسل رمز التحقق ، لا يتم إرسال رسالة SMS فعلية. بدلاً من ذلك ، تحتاج إلى تقديم رمز التحقق الذي تم تكوينه مسبقًا لإكمال تسجيل الدخول.
عند اكتمال تسجيل الدخول ، يتم إنشاء مستخدم Firebase برقم الهاتف هذا. يمتلك المستخدم نفس السلوك والخصائص مثل مستخدم رقم هاتف حقيقي ، ويمكنه الوصول إلى Realtime Database / Cloud Firestore والخدمات الأخرى بنفس الطريقة. الرمز المميز للمعرف الذي تم سكه أثناء هذه العملية له نفس توقيع مستخدم رقم هاتف حقيقي.
هناك خيار آخر وهو تعيين دور اختباري عبر مطالبات مخصصة على هؤلاء المستخدمين لتمييزهم كمستخدمين مزيفين إذا كنت ترغب في تقييد الوصول بشكل أكبر.
لتشغيل تدفق reCAPTCHA يدويًا للاختبار ، استخدم طريقة
forceRecaptchaFlowForTesting()
.// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
اختبار التكامل
بالإضافة إلى الاختبار اليدوي ، توفر مصادقة Firebase واجهات برمجة تطبيقات للمساعدة في كتابة اختبارات التكامل لاختبار مصادقة الهاتف. تعمل واجهات برمجة التطبيقات هذه على تعطيل التحقق من التطبيق عن طريق تعطيل متطلبات reCAPTCHA في الويب وإشعارات الدفع الصامتة في iOS. هذا يجعل اختبار الأتمتة ممكنًا في هذه التدفقات ويسهل تنفيذه. بالإضافة إلى ذلك ، فهي تساعد في توفير القدرة على اختبار تدفقات التحقق الفوري على Android.
على نظام Android ، اتصل
setAppVerificationDisabledForTesting()
قبل استدعاءsignInWithPhoneNumber
. يؤدي هذا إلى تعطيل التحقق من التطبيق تلقائيًا ، مما يسمح لك بتمرير رقم الهاتف دون حله يدويًا. لاحظ أنه على الرغم من تعطيل reCAPTCHA و / أو SafetyNet ، فإن استخدام رقم هاتف حقيقي سيظل يفشل في إكمال تسجيل الدخول. لا يمكن استخدام سوى أرقام الهواتف الوهمية مع واجهة برمجة التطبيقات هذه.// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
يؤدي الاتصال بـ
verifyPhoneNumber
برقم وهمي إلى تشغيل رد الاتصالonCodeSent
، والذي ستحتاج فيه إلى تقديم رمز التحقق المقابل. يسمح هذا بإجراء الاختبار في محاكيات Android.Java
String phoneNum = "+16505554567"; String testVerificationCode = "123456"; // Whenever verification is triggered with the whitelisted number, // provided it is not set for auto-retrieval, onCodeSent will be triggered. FirebaseAuth auth = FirebaseAuth.getInstance(); PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth) .setPhoneNumber(phoneNum) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override public void onCodeSent(@NonNull String verificationId, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) { // Save the verification id somewhere // ... // The corresponding whitelisted code above should be used to complete sign-in. MainActivity.this.enableUserManuallyInputCode(); } @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) { // Sign in with the credential // ... } @Override public void onVerificationFailed(@NonNull FirebaseException e) { // ... } }) .build(); PhoneAuthProvider.verifyPhoneNumber(options);
Kotlin+KTX
val phoneNum = "+16505554567" val testVerificationCode = "123456" // Whenever verification is triggered with the whitelisted number, // provided it is not set for auto-retrieval, onCodeSent will be triggered. val options = PhoneAuthOptions.newBuilder(Firebase.auth) .setPhoneNumber(phoneNum) .setTimeout(30L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() { override fun onCodeSent( verificationId: String, forceResendingToken: PhoneAuthProvider.ForceResendingToken ) { // Save the verification id somewhere // ... // The corresponding whitelisted code above should be used to complete sign-in. this@MainActivity.enableUserManuallyInputCode() } override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) { // Sign in with the credential // ... } override fun onVerificationFailed(e: FirebaseException) { // ... } }) .build() PhoneAuthProvider.verifyPhoneNumber(options)
بالإضافة إلى ذلك ، يمكنك اختبار تدفقات الاسترداد التلقائي في Android عن طريق تعيين الرقم التخيلي ورمز التحقق المقابل للاسترداد التلقائي عن طريق استدعاء
setAutoRetrievedSmsCodeForPhoneNumber
.عندما يتم استدعاء
verifyPhoneNumber
، يتم تشغيلهonVerificationCompleted
معPhoneAuthCredential
مباشرة. هذا يعمل فقط مع أرقام الهواتف الخيالية.تأكد من تعطيل هذا الخيار ومن عدم وجود أرقام هواتف وهمية مشفرة في تطبيقك عند نشر تطبيقك على متجر Google Play.
Java
// The test phone number and code should be whitelisted in the console. String phoneNumber = "+16505554567"; String smsCode = "123456"; FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings(); // Configure faking the auto-retrieval with the whitelisted numbers. firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode); PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth) .setPhoneNumber(phoneNumber) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) { // Instant verification is applied and a credential is directly returned. // ... } // ... }) .build(); PhoneAuthProvider.verifyPhoneNumber(options);
Kotlin+KTX
// The test phone number and code should be whitelisted in the console. val phoneNumber = "+16505554567" val smsCode = "123456" val firebaseAuth = Firebase.auth val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings // Configure faking the auto-retrieval with the whitelisted numbers. firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode) val options = PhoneAuthOptions.newBuilder(firebaseAuth) .setPhoneNumber(phoneNumber) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() { override fun onVerificationCompleted(credential: PhoneAuthCredential) { // Instant verification is applied and a credential is directly returned. // ... } // ... }) .build() PhoneAuthProvider.verifyPhoneNumber(options)
الخطوات التالية
بعد أن يقوم المستخدم بتسجيل الدخول لأول مرة ، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - المستخدم الذي قام بتسجيل الدخول باستخدام. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك ، ويمكن استخدامه لتحديد هوية مستخدم عبر كل تطبيق في مشروعك ، بغض النظر عن كيفية تسجيل المستخدم للدخول.
في تطبيقاتك ، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من كائن
FirebaseUser
. انظر إدارة المستخدمين .في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير
auth
، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم ،
signOut
:وKotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
يمكنك استخدام مصادقة Firebase لتسجيل دخول مستخدم عن طريق إرسال رسالة SMS إلى هاتف المستخدم. يقوم المستخدم بتسجيل الدخول باستخدام رمز يستخدم لمرة واحدة موجود في رسالة SMS.
تتمثل أسهل طريقة لإضافة تسجيل الدخول برقم الهاتف إلى تطبيقك في استخدام FirebaseUI ، والذي يتضمن أداة تسجيل الدخول التي تعمل على تسجيل الدخول والتي تنفذ تدفقات تسجيل الدخول لتسجيل الدخول إلى رقم الهاتف ، بالإضافة إلى تسجيل الدخول المستند إلى كلمة المرور والتسجيل الموحد -في. يصف هذا المستند كيفية تنفيذ تدفق تسجيل الدخول إلى رقم الهاتف باستخدام Firebase SDK.
قبل ان تبدأ
- أضف Firebase إلى مشروع Android ، إذا لم تكن قد قمت بذلك بالفعل.
- في ملف Gradle (على مستوى التطبيق) للوحدة النمطية (عادةً ما يكون
<project>/<app-module>/build.gradle
) ، أضف تبعية مكتبة Firebase Authentication Android. نوصي باستخدام Firebase Android BoM للتحكم في إصدارات المكتبة.Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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-ktx' }
باستخدام 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-ktx:21.1.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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:21.1.0' }
- إذا لم تكن قد ربطت تطبيقك بمشروع Firebase حتى الآن ، فافعل ذلك من وحدة تحكم Firebase .
- إذا لم تكن قد قمت بالفعل بتعيين تجزئة SHA-1 لتطبيقك في وحدة تحكم Firebase ، فافعل ذلك. راجع مصادقة عميلك للحصول على معلومات حول العثور على تجزئة SHA-1 لتطبيقك.
مخاوف أمنية
المصادقة باستخدام رقم هاتف فقط ، على الرغم من ملاءمتها ، إلا أنها أقل أمانًا من الطرق الأخرى المتاحة ، لأن حيازة رقم هاتف يمكن نقلها بسهولة بين المستخدمين. أيضًا ، على الأجهزة ذات ملفات تعريف المستخدمين المتعددة ، يمكن لأي مستخدم يمكنه تلقي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك ، فيجب أن تقدمه جنبًا إلى جنب مع طرق تسجيل دخول أكثر أمانًا ، وإبلاغ المستخدمين بالمقايضات الأمنية باستخدام تسجيل الدخول برقم الهاتف.
تفعيل تسجيل الدخول إلى رقم الهاتف لمشروع Firebase
لتسجيل دخول المستخدمين عن طريق الرسائل القصيرة SMS ، يجب أولاً تمكين طريقة تسجيل الدخول إلى رقم الهاتف لمشروع Firebase:
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في صفحة طريقة تسجيل الدخول ، قم بتمكين طريقة تسجيل الدخول برقم الهاتف .
الحصة النسبية لطلبات تسجيل الدخول إلى رقم هاتف Firebase عالية بما يكفي لعدم تأثر معظم التطبيقات. ومع ذلك ، إذا كنت بحاجة إلى تسجيل دخول عدد كبير جدًا من المستخدمين باستخدام مصادقة الهاتف ، فقد تحتاج إلى ترقية خطة التسعير الخاصة بك. انظر صفحة التسعير .
تفعيل التحقق من التطبيق
لاستخدام مصادقة رقم الهاتف ، يجب أن يكون Firebase قادرًا على التحقق من أن طلبات تسجيل الدخول إلى رقم الهاتف واردة من تطبيقك. هناك طريقتان لإنجاز Firebase Authentication:
- SafetyNet : إذا كان لدى المستخدم جهاز مثبت عليه خدمات Google Play ، ويمكن لمصادقة Firebase التحقق من أن الجهاز شرعي باستخدام Android SafetyNet ، فيمكن متابعة تسجيل الدخول إلى رقم الهاتف.
- في Google Cloud Console ، قم بتمكين واجهة برمجة تطبيقات التحقق من جهاز Android (DEPRECATED) لمشروعك. سيتم استخدام مفتاح Firebase API الافتراضي ، ويلزم السماح له بالوصول إلى واجهة برمجة تطبيقات DeviceCheck.
- إذا لم تكن قد حددت بصمة إصبع SHA-256 لتطبيقك ، فقم بذلك من صفحة الإعدادات في وحدة تحكم Firebase. راجع مصادقة عميلك للحصول على تفاصيل حول كيفية الحصول على بصمة SHA-256 لتطبيقك.
- التحقق من reCAPTCHA : في حالة عدم إمكانية استخدام SafetyNet ، مثل عندما لا يكون لدى المستخدم دعم خدمات Google Play ، أو عند اختبار تطبيقك على محاكي ، تستخدم مصادقة Firebase التحقق من reCAPTCHA لإكمال تدفق تسجيل الدخول عبر الهاتف. غالبًا ما يمكن إكمال اختبار reCAPTCHA دون أن يضطر المستخدم إلى حل أي شيء. يرجى ملاحظة أن هذا التدفق يتطلب أن يكون SHA-1 مرتبطًا بتطبيقك. يتطلب هذا التدفق أيضًا أن يكون مفتاح واجهة برمجة التطبيقات غير مقيد أو مسموح به لـ "$ {PROJECT_NAME} .firebaseapp.com".
لتمكين SafetyNet للاستخدام مع مصادقة Firebase:
أرسل رمز التحقق إلى هاتف المستخدم
لبدء تسجيل الدخول إلى رقم الهاتف ، قدم للمستخدم واجهة تطالبه بكتابة رقم هاتفه. تختلف المتطلبات القانونية ، ولكن كأفضل ممارسة ولتحديد التوقعات للمستخدمين ، يجب عليك إبلاغهم بأنهم إذا استخدموا تسجيل الدخول عبر الهاتف ، فقد يتلقون رسالة 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) // Activity (for callback binding) .setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks .build(); PhoneAuthProvider.verifyPhoneNumber(options);
يتم إعادة إدخال طريقة التحقق من رقم الهاتف: إذا اتصلت بها عدة مرات ، كما هو الحال في طريقة
verifyPhoneNumber
الخاصةonStart
ما ، فلن ترسل طريقةverifyPhoneNumber
من رقم الهاتف رسالة نصية قصيرة ثانية إلا إذا انقضت مهلة الطلب الأصلي.يمكنك استخدام هذا السلوك لاستئناف عملية تسجيل الدخول إلى رقم الهاتف إذا تم إغلاق تطبيقك قبل أن يتمكن المستخدم من تسجيل الدخول (على سبيل المثال ، أثناء استخدام المستخدم لتطبيق الرسائل القصيرة). بعد الاتصال
verifyPhoneNumber
، قم بتعيين علامة تشير إلى أن التحقق قيد التقدم. بعد ذلك ، احفظ العلامة في طريقةonSaveInstanceState
الخاصة بنشاطك واستعد العلامة فيonRestoreInstanceState
. أخيرًا ، في طريقةonStart
الخاصة بنشاطك ، تحقق مما إذا كان التحقق قيد التقدم بالفعل ، وإذا كان الأمر كذلك ، فاتصلverifyPhoneNumber
مرة أخرى. تأكد من مسح العلم عند اكتمال التحقق أو فشله (انظر عمليات رد الاتصال للتحقق ).للتعامل بسهولة مع تدوير الشاشة وحالات إعادة تشغيل النشاط الأخرى ، مرر نشاطك إلى طريقة
verifyPhoneNumber
من رقم الهاتف. سيتم فصل عمليات الاسترجاعات تلقائيًا عند توقف النشاط ، بحيث يمكنك كتابة رمز انتقال واجهة المستخدم بحرية في طرق رد الاتصال.يمكن أيضًا ترجمة رسالة SMS التي أرسلها Firebase عن طريق تحديد لغة المصادقة عبر طريقة
setLanguageCode
على مثيل Auth الخاص بك.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 } // 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 } // 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. (في الوقت نفسه ، قد يستمر التحقق التلقائي في الخلفية.) بعد ذلك ، بعد أن يكتب المستخدم رمز التحقق ، يمكنك استخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلى الطريقة لإنشاء كائن
PhoneAuthCredential
، والذي يمكنك بدورها استخدامها لتسجيل دخول المستخدم. ومع ذلك ، قد تنتظر بعض التطبيقات حتى يتم استدعاءonCodeAutoRetrievalTimeOut
قبل عرض رمز التحقق UI (غير مستحسن).onCodeAutoRetrievalTimeOut (معرف التحقق من السلسلة)
اختياري. يتم استدعاء هذا الأسلوب بعد انقضاء مدة المهلة المحددة للتحقق من رقم الهاتف دون
onVerificationCompleted
verifyPhoneNumber
. على الأجهزة التي لا تحتوي على بطاقات SIM ، يتم استدعاء هذه الطريقة على الفور لأن الاسترداد التلقائي للرسائل القصيرة غير ممكن.تحظر بعض التطبيقات إدخال المستخدم حتى تنتهي مهلة التحقق التلقائي ، وعندها فقط تعرض واجهة مستخدم تطالب المستخدم بكتابة رمز التحقق من رسالة SMS (غير مستحسن).
قم بإنشاء كائن PhoneAuthCredential
بعد أن يقوم المستخدم بإدخال رمز التحقق الذي أرسله Firebase إلى هاتف المستخدم ، قم بإنشاء كائن
PhoneAuthCredential
، باستخدام رمز التحقق ومعرف التحقق الذي تم تمريره إلىonCodeSent
أوonCodeAutoRetrievalTimeOut
callback. (عند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.
- اكتب اختبارات التكامل دون أن تمنعك فحوصات الأمان التي تُطبق عادةً على أرقام الهواتف الحقيقية في بيئة الإنتاج.
يجب أن تستوفي أرقام الهواتف الخيالية المتطلبات التالية:
- تأكد من استخدام أرقام هواتف خيالية بالفعل وغير موجودة بالفعل. لا تسمح لك مصادقة Firebase بتعيين أرقام الهواتف الحالية التي يستخدمها المستخدمون الحقيقيون كأرقام اختبار. أحد الخيارات هو استخدام 555 رقمًا مسبوقًا كأرقام هواتف تجريبية في الولايات المتحدة ، على سبيل المثال: +1 650-555-3434
- يجب تنسيق أرقام الهواتف بشكل صحيح وفقًا للطول والقيود الأخرى. سيستمرون في إجراء نفس التحقق من صحة رقم هاتف المستخدم الحقيقي.
- يمكنك إضافة ما يصل إلى 10 أرقام هواتف للتطوير.
- استخدم أرقام هواتف / أكواد اختبارية يصعب تخمينها وقم بتغييرها بشكل متكرر.
قم بإنشاء أرقام هواتف ورموز تحقق خيالية
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر الهاتف إذا لم تكن قد قمت بذلك بالفعل.
- افتح قائمة أرقام الهواتف لاختبار الأكورديون.
- أدخل رقم الهاتف الذي تريد اختباره ، على سبيل المثال: 3434-555-555 +1 650 .
- قدم رمز التحقق المكون من 6 أرقام لهذا الرقم المحدد ، على سبيل المثال: 654321 .
- أضف الرقم. إذا كانت هناك حاجة ، يمكنك حذف رقم الهاتف ورمزه بالمرور فوق الصف المقابل والنقر فوق أيقونة سلة المهملات.
الاختبار اليدوي
يمكنك البدء مباشرة في استخدام رقم هاتف وهمي في تطبيقك. يتيح لك ذلك إجراء اختبار يدوي أثناء مراحل التطوير دون التعرض لمشكلات في الحصة النسبية أو تقييدها. يمكنك أيضًا الاختبار مباشرة من محاكي iOS أو محاكي Android بدون تثبيت خدمات Google Play.
عندما تقدم رقم الهاتف الوهمي وترسل رمز التحقق ، لا يتم إرسال رسالة SMS فعلية. بدلاً من ذلك ، تحتاج إلى تقديم رمز التحقق الذي تم تكوينه مسبقًا لإكمال تسجيل الدخول.
عند اكتمال تسجيل الدخول ، يتم إنشاء مستخدم Firebase برقم الهاتف هذا. The user has the same behavior and properties as a real phone number user, and can access Realtime Database/Cloud Firestore and other services the same way. The ID token minted during this process has the same signature as a real phone number user.
Another option is to set a test role via custom claims on these users to differentiate them as fake users if you want to further restrict access.
To manually trigger the reCAPTCHA flow for testing, use the
forceRecaptchaFlowForTesting()
method.// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
Integration testing
In addition to manual testing, Firebase Authentication provides APIs to help write integration tests for phone auth testing. These APIs disable app verification by disabling the reCAPTCHA requirement in web and silent push notifications in iOS. This makes automation testing possible in these flows and easier to implement. In addition, they help provide the ability to test instant verification flows on Android.
On Android, call
setAppVerificationDisabledForTesting()
before thesignInWithPhoneNumber
call. This disables app verification automatically, allowing you to pass the phone number without manually solving it. Note that even though reCAPTCHA and/or SafetyNet are disabled, using a real phone number will still fail to complete sign in. Only fictional phone numbers can be used with this API.// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
Calling
verifyPhoneNumber
with a fictional number triggers theonCodeSent
callback, in which you'll need to provide the corresponding verification code. This allows testing in Android Emulators.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)
Additionally, you can test auto-retrieval flows in Android by setting the fictional number and its corresponding verification code for auto-retrieval by calling
setAutoRetrievedSmsCodeForPhoneNumber
.When
verifyPhoneNumber
is called, it triggersonVerificationCompleted
with thePhoneAuthCredential
directly. This works only with fictional phone numbers.Make sure this is disabled and no fictional phone numbers are hardcoded in your app when publishing your application to the 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+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)
Next steps
After a user signs in for the first time, a new user account is created and linked to the credentials—that is, the user name and password, phone number, or auth provider information—the user signed in with. This new account is stored as part of your Firebase project, and can be used to identify a user across every app in your project, regardless of how the user signs in.
In your apps, you can get the user's basic profile information from the
FirebaseUser
object. See Manage Users .In your Firebase Realtime Database and Cloud Storage Security Rules , you can get the signed-in user's unique user ID from the
auth
variable, and use it to control what data a user can access.
You can allow users to sign in to your app using multiple authentication providers by linking auth provider credentials to an existing user account.
To sign out a user, call
signOut
:Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
إنّ محتوى هذه الصفحة مرخّص بموجب ترخيص Creative Commons Attribution 4.0 ما لم يُنصّ على خلاف ذلك، ونماذج الرموز مرخّصة بموجب ترخيص Apache 2.0. للاطّلاع على التفاصيل، يُرجى مراجعة سياسات موقع Google Developers. إنّ Java هي علامة تجارية مسجَّلة لشركة Oracle و/أو شركائها التابعين.
تاريخ التعديل الأخير: 2023-03-05 (حسب التوقيت العالمي المتفَّق عليه)
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"لا يحتوي على المعلومات التي أحتاج إليها." },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"الخطوات معقدة للغاية / كثيرة جدًا." },{ "type": "thumb-down", "id": "outOfDate", "label":"المحتوى قديم." },{ "type": "thumb-down", "id": "translationIssue", "label":"ثمة مشكلة في الترجمة." },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"مشكلة في العيّنات / التعليمات البرمجية" },{ "type": "thumb-down", "id": "otherDown", "label":"غير ذلك" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"يسهُل فهم المحتوى." },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"ساعَدني المحتوى في حلّ مشكلتي." },{ "type": "thumb-up", "id": "otherUp", "label":"غير ذلك" }]