المصادقة باستخدام 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: (تم إيقافها، استخدِم linkDomain) عند تحديد نطاقات متعددة مخصّصة للروابط الديناميكية لمشروع، حدِّد النطاق الذي سيتم استخدامه عند فتح الرابط باستخدام تطبيق محدّد على الأجهزة الجوّالة (مثل example.page.link). وإلا، سيتم اختيار النطاق الأول تلقائيًا.

    • linkDomain: نطاق استضافة Firebase المخصّص الاختياري الذي سيتم استخدامه عند فتح الرابط باستخدام تطبيق محدّد على الأجهزة الجوّالة. يجب ضبط النطاق في استضافة Firebase وأن يكون مملوكًا للمشروع. لا يمكن أن يكون هذا النطاق نطاق Hosting تلقائيًا (web.app أو firebaseapp.com). ويحلّ هذا النطاق محلّ الإعداد dynamicLinkDomain الذي تم إيقافه.

    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 Hosting لإرسال رابط تسجيل الدخول. اتّبِع الأدلة الخاصة بالإعداد على كل منصة:

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

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

    // 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()، التي سبق أن نصحنا بتنفيذها لعمليات تسجيل الدخول التي تبدأ بالمعرّف.

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

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

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

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

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

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

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

لتسجيل خروج مستخدم، استدعِ الدالة signOut():

await FirebaseAuth.instance.signOut();