المصادقة مع Firebase باستخدام "روابط البريد الإلكتروني"

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

هناك عدة مزايا لتسجيل الدخول عبر البريد الإلكتروني:

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

قبل البدء

  1. يُرجى اتّباع الخطوات الواردة في دليل البدء، إذا لم يسبق لك فعل ذلك.

  2. فعِّل ميزة تسجيل الدخول باستخدام رابط البريد الإلكتروني لمشروع Firebase.

    لتسجيل دخول المستخدمين من خلال رابط البريد الإلكتروني، يجب أولاً تفعيل مزوِّد خدمة البريد الإلكتروني. وطريقة تسجيل الدخول باستخدام رابط البريد الإلكتروني لمشروعك على Firebase:

    1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
    2. في علامة التبويب طريقة تسجيل الدخول، فعِّل مزوِّد البريد الإلكتروني/كلمة المرور. ملاحظة: يجب تفعيل تسجيل الدخول باستخدام عنوان البريد الإلكتروني/كلمة المرور لاستخدام رابط البريد الإلكتروني. لتسجيل الدخول.
    3. في القسم نفسه، فعِّل الخيار رابط البريد الإلكتروني (تسجيل الدخول بدون كلمة مرور). تسجيل الدخول.
    4. انقر على حفظ.

لبدء مسار المصادقة، قدِّم واجهة تطلب من المستخدم تقديم عنوان بريده الإلكتروني، ثم اتصِل بـ sendSignInLinkToEmail() لطلب إرسال رابط المصادقة إلى البريد الإلكتروني للمستخدم من خلال Firebase.

  1. أنشئ كائن ActionCodeSettings الذي يزوّد Firebase بتعليمات عن كيفية إنشاء رابط البريد الإلكتروني. اضبط الحقول التالية:

    • url: هو الرابط لصفحة معيّنة التي سيتم تضمينها وأي حالة إضافية يجب تمريرها. يجب وضع نطاق الرابط في القائمة البيضاء للنطاقات المسموح بها في وحدة تحكُّم Firebase، والتي يمكن العثور عليها بالانتقال إلى علامة التبويب "طريقة تسجيل الدخول" (المصادقة -> طريقة تسجيل الدخول). سيعيد الرابط توجيه المستخدم إلى عنوان URL هذا إذا لم يتم تثبيت التطبيق على جهازه وتعذَّر تثبيت التطبيق.

    • androidPackageName وIOSBundleId: التطبيقان المطلوب استخدامهما عند فتح رابط تسجيل الدخول على جهاز Android أو iOS. اطّلِع على المزيد من المعلومات عن كيفية ضبط "روابط Firebase الديناميكية" لفتح روابط إجراءات البريد الإلكتروني من خلال التطبيقات المتوافقة مع الأجهزة الجوّالة.

    • handleCodeInApp: تم الضبط على true. يجب أن تكتمل عملية تسجيل الدخول دائمًا في التطبيق على عكس الإجراءات الأخرى للبريد الإلكتروني خارج النطاق (أي إعادة ضبط كلمة المرور والتحقق من عنوان البريد الإلكتروني). ويرجع ذلك إلى أنّه في نهاية عملية الإعداد، من المتوقّع أن يكون المستخدم مسجّلاً الدخول وتستمر حالة المصادقة داخل التطبيق.

    • dynamicLinkDomain: عند تحديد عدة نطاقات روابط ديناميكية مخصّصة لمشروع معيّن، يمكنك تحديد النطاق الذي تريد استخدامه عند فتح الرابط من خلال تطبيق متوافق مع الأجهزة الجوّالة محدّد (مثل example.page.link). وبخلاف ذلك، يتم اختيار النطاق الأول تلقائيًا.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. اطلب من المستخدم إدخال بريده الإلكتروني.

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

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

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

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

ويمكنك تبسيط هذا المسار للمستخدمين الذين يفتحون رابط تسجيل الدخول على الجهاز الذي يطلبون الرابط فيه، عن طريق تخزين عنوان البريد الإلكتروني محليًا على مثال باستخدام SharedPreferences - عند إرسالك عنوان البريد الإلكتروني لتسجيل الدخول. بعد ذلك، يُرجى اتّباع الخطوات التالية: استخدم هذا العنوان لإكمال التدفق. لا تدخِل البريد الإلكتروني للمستخدم في معلَمات عنوان URL لإعادة التوجيه وأعِد استخدامه فقد يؤدي ذلك إلى تفعيل حقن الجلسات.

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

احرص أيضًا على استخدام عنوان URL يستخدم HTTPS في مرحلة الإنتاج لتجنّب استخدام الرابط من المحتمل أن تعترضها الخوادم الوسيطة.

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

  1. يمكنك إعداد تطبيقك لتلقّي الروابط الديناميكية على Flutter في الدليل.

  2. في معالج الروابط، تحقَّق مما إذا كان الرابط مخصَّصًا لمصادقة رابط البريد الإلكتروني. وفي حال حدوث ذلك، أكمِل عملية تسجيل الدخول.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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

سيكون الاختلاف في النصف الثاني من العملية:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

ويمكن استخدامها أيضًا لإعادة مصادقة مستخدم رابط البريد الإلكتروني قبل تشغيل عملية حساسة.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

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

إذا أنشأت مشروعك في 15 أيلول (سبتمبر) 2023 أو بعده، يجب تعداد البريد الإلكتروني تكون ميزة "توفير السلامة تلقائيًا" مفعَّلة تلقائيًا تعمل هذه الميزة على تحسين أمان في المشروع، ولكن سيتم إيقاف fetchSignInMethodsForEmail() التي اقترحناها سابقًا لتنفيذ تدفقات المُعرّف أولاً.

على الرغم من أنّه يمكنك إيقاف حماية تعداد البريد الإلكتروني في مشروعك، أن نوصي بعدم القيام بذلك.

اطّلِع على المستندات حول حماية تعداد عناوين البريد الإلكتروني. لمزيد من التفاصيل.

الخطوات التالية

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

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

في "قاعدة بيانات Firebase في الوقت الفعلي" و"قواعد أمان Cloud Storage"، يمكنك الحصول على رقم تعريف المستخدِم الفريد الخاص بالمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه من أجل للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام طرق مصادقة متعددة. موفِّري خدمة المصادقة من خلال ربط بيانات اعتماد موفِّر المصادقة) حساب مستخدم حالي.

لتسجيل خروج مستخدم، يُرجى الاتصال بالرقم signOut():

await FirebaseAuth.instance.signOut();