Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

مصادقة الهاتف

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

سيتم إرسال أرقام الهواتف التي يوفرها المستخدمون للمصادقة وتخزينها بواسطة Google لتحسين منع البريد العشوائي وإساءة الاستخدام عبر خدمة Google ، بما في ذلك ، على سبيل المثال لا الحصر ، Firebase. يجب على المطورين التأكد من حصولهم على موافقة المستخدم النهائي المناسبة قبل استخدام خدمة تسجيل الدخول برقم هاتف Firebase Authentication.

لا يتم دعم مصادقة هاتف Firebase في جميع البلدان. يرجى الاطلاع على الأسئلة الشائعة لمزيد من المعلومات.

اقامة

قبل البدء بمصادقة الهاتف ، تأكد من اتباع الخطوات التالية:

  1. قم بتمكين الهاتف كطريقة لتسجيل الدخول في وحدة تحكم Firebase .
  2. Android : إذا لم تكن قد قمت بالفعل بتعيين تجزئة SHA-1 لتطبيقك في وحدة تحكم Firebase ، فافعل ذلك. راجع مصادقة عميلك للحصول على معلومات حول العثور على تجزئة SHA-1 لتطبيقك.
  3. iOS : في Xcode ، قم بتمكين دفع الإشعارات لمشروعك وتأكد من تكوين مفتاح مصادقة APN الخاص بك باستخدام Firebase Cloud Messaging (FCM) . لعرض شرح مفصل لهذه الخطوة ، قم بعرض وثائق Firebase iOS Phone Auth .
  4. الويب : تأكد من أنك قد أضفت نطاق تطبيقاتك إلى وحدة تحكم Firebase ، ضمن نطاقات إعادة توجيه OAuth .

ملاحظة ؛ تسجيل الدخول برقم الهاتف متاح فقط للاستخدام على الأجهزة الحقيقية والويب. لاختبار تدفق المصادقة على برامج محاكاة الجهاز ، يرجى الاطلاع على الاختبار .

إستعمال

يوفر Firebase Authentication SDK for Flutter طريقتين فرديتين لتسجيل دخول مستخدم برقم هاتفه. توفر الأنظمة الأساسية الأصلية (مثل Android و iOS) وظائف مختلفة للتحقق من صحة رقم الهاتف مقارنةً بالويب ، لذلك توجد طريقتان لكل منصة على وجه الحصر:

  • النظام الأساسي الأصلي : verifyPhoneNumber .
  • منصة الويب : signInWithPhoneNumber .

محلي: verifyPhoneNumber

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

يجب أولاً مطالبة المستخدم برقم هاتفه. بمجرد تقديمه ، اتصل verifyPhoneNumber() :

await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);

هناك 4 عمليات رد نداء منفصلة يجب أن تتعامل معها ، سيحدد كل منها كيفية تحديث واجهة مستخدم التطبيق:

  1. التحقق مكتمل : المعالجة التلقائية لرمز SMS على أجهزة Android.
  2. فشل التحقق : معالجة أحداث الفشل مثل أرقام الهواتف غير الصالحة أو ما إذا كان قد تم تجاوز حصة الرسائل القصيرة.
  3. codeSent : تعامل عند إرسال رمز إلى الجهاز من Firebase ، يُستخدم لمطالبة المستخدمين بإدخال الرمز.
  4. codeAutoRetrievalTimeout : معالجة مهلة عندما تفشل المعالجة التلقائية لرمز SMS.

التحقق

سيتم استدعاء هذا المعالج فقط على أجهزة Android التي تدعم دقة رمز الرسائل القصيرة تلقائيًا.

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!

    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);

فشل التحقق

إذا قام Firebase بإرجاع خطأ ، على سبيل المثال لرقم هاتف غير صحيح أو إذا تجاوزت حصة الرسائل القصيرة SMS للمشروع ، فسيتم إرسال FirebaseAuthException إلى هذا المعالج. في هذه الحالة ، ستطلب من المستخدم حدوث خطأ ما بناءً على رمز الخطأ.

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }

    // Handle other errors
  },
);

تم ارسال الكود

عندما يرسل resendToken رمزًا عبر رسالة نصية قصيرة إلى الجهاز ، يتم تشغيل هذا المعالج بمعرف verificationId وإعادة الإرسال (يتم دعم resendToken فقط على أجهزة Android ، وستقوم أجهزة iOS دائمًا بإرجاع قيمة null ).

بمجرد التشغيل ، سيكون الوقت مناسبًا لتحديث واجهة مستخدم التطبيق لمطالبة المستخدم بإدخال رمز الرسائل القصيرة الذي يتوقعه. بمجرد إدخال رمز SMS ، يمكنك دمج معرف التحقق مع رمز SMS لإنشاء PhoneAuthCredential جديد:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';

    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);

    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);

افتراضيًا ، لن يقوم Firebase بإعادة إرسال رسالة SMS جديدة إذا تم إرسالها مؤخرًا. ومع ذلك ، يمكنك تجاوز هذا السلوك عن طريق إعادة استدعاء طريقة verifyPhoneNumber من رقم الهاتف مع رمز إعادة الإرسال إلى وسيطة forceResendingToken . إذا نجحت ، فسيتم إعادة إرسال رسالة SMS.

codeAutoRetrievalTimeout

على أجهزة Android التي تدعم دقة رمز SMS تلقائيًا ، سيتم استدعاء هذا المعالج إذا لم يقم الجهاز تلقائيًا بحل رسالة SMS خلال إطار زمني معين. بمجرد مرور الإطار الزمني ، لن يحاول الجهاز بعد ذلك حل أي رسائل واردة.

بشكل افتراضي ، ينتظر الجهاز لمدة 30 ثانية ، ولكن يمكن تخصيص ذلك باستخدام وسيطة timeout :

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);

الويب: signInWithPhoneNumber

على منصات الويب ، يمكن للمستخدمين تسجيل الدخول عن طريق التأكيد على أن لديهم حق الوصول إلى الهاتف عن طريق إدخال رمز SMS المرسل إلى رقم الهاتف المقدم. لمزيد من الأمان ومنع البريد العشوائي ، يُطلب من المستخدمين إثبات أنهم بشر من خلال استكمال أداة Google reCAPTCHA . بمجرد التأكيد ، سيتم إرسال رمز SMS.

ستدير Firebase Authentication SDK for Flutter أداة reCAPTCHA خارج الصندوق افتراضيًا ، ولكنها توفر التحكم في كيفية عرضها وتهيئتها إذا لزم الأمر. للبدء ، اتصل signInWithPhoneNumber مع رقم الهاتف برقم الهاتف.

FirebaseAuth auth = FirebaseAuth.instance;

// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');

سيؤدي استدعاء الطريقة أولاً إلى تشغيل أداة reCAPTCHA للعرض. يجب على المستخدم إكمال الاختبار قبل إرسال رمز SMS. بمجرد الانتهاء ، يمكنك تسجيل دخول المستخدم عن طريق توفير رمز SMS إلى طريقة confirm على استجابة ConfirmationResult التي تم حلها:

UserCredential userCredential = await confirmationResult.confirm('123456');

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

تكوين reCAPTCHA

عنصر واجهة reCAPTCHA عبارة عن تدفق مُدار بالكامل يوفر الأمان لتطبيق الويب الخاص بك.

تقبل الوسيطة الثانية من signInWithPhoneNumber RecaptchaVerifier الذي يمكن استخدامه لإدارة عنصر واجهة المستخدم. بشكل افتراضي ، سيتم عرض الأداة كأداة غير مرئية عند بدء تدفق تسجيل الدخول. ستظهر أداة "غير مرئية" على شكل صفحة كاملة مشروط أعلى التطبيق الخاص بك.

ومع ذلك ، من الممكن عرض عنصر واجهة مستخدم مضمن يتعين على المستخدم الضغط عليه بشكل صريح للتحقق من نفسه.

لإضافة عنصر واجهة مستخدم مضمن ، حدد معرف عنصر DOM إلى وسيطة container لمثيل RecaptchaVerifier . يجب أن يكون العنصر موجودًا وأن يكون فارغًا وإلا فسيتم طرح خطأ. إذا لم يتم توفير وسيطة container ، فسيتم عرض الأداة على أنها "غير مرئية".

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

يمكنك اختياريًا تغيير الحجم والموضوع عن طريق تخصيص وسيطات size theme كما هو موضح أعلاه.

من الممكن أيضًا الاستماع إلى الأحداث ، مثل ما إذا كان المستخدم قد أكمل reCAPTCHA ، وما إذا كانت reCAPTCHA قد انتهت صلاحيتها أو حدث خطأ:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

اختبارات

يوفر Firebase دعمًا لاختبار أرقام الهواتف محليًا:

  1. في Firebase Console ، حدد موفر مصادقة "الهاتف" وانقر على القائمة المنسدلة "أرقام الهواتف للاختبار".
  2. أدخل رقم هاتف جديدًا (على سبيل المثال +44 7444 555666 ) ورمز اختبار (على سبيل المثال 123456 ).

في حالة تقديم رقم هاتف تجريبي إما إلى verifyPhoneNumber signInWithPhoneNumber رقم الهاتف أو تسجيل الدخول مع هاتف رقم الهاتف ، فلن يتم إرسال أية رسائل نصية قصيرة بالفعل. يمكنك بدلاً من ذلك تقديم رمز الاختبار مباشرةً إلى PhoneAuthProvider أو باستخدام معالج نتيجة تأكيد signInWithPhoneNumber s.