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

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

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

الخطوات اللاحقة

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

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

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

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

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

await FirebaseAuth.instance.signOut();