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

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

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

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

قبل ان تبدأ

  1. إذا لم تكن قد فعلت ذلك بالفعل، فاتبع الخطوات الواردة في دليل البدء .

  2. تمكين تسجيل الدخول عبر رابط البريد الإلكتروني لمشروع Firebase الخاص بك.

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

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

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

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

    • url : الرابط العميق المراد تضمينه وأي حالة إضافية سيتم تمريرها. يجب إدراج نطاق الرابط في القائمة البيضاء في قائمة Firebase Console للنطاقات المعتمدة، والتي يمكن العثور عليها بالانتقال إلى علامة تبويب طريقة تسجيل الدخول (المصادقة -> طريقة تسجيل الدخول). سيعيد الرابط توجيه المستخدم إلى عنوان 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 Auth تقديم عنوان البريد الإلكتروني للمستخدم عند إكمال تدفق تسجيل الدخول. لكي تنجح عملية تسجيل الدخول، يجب أن يتطابق عنوان البريد الإلكتروني هذا مع العنوان الذي تم إرسال رابط تسجيل الدخول إليه في الأصل.

يمكنك تبسيط هذا التدفق للمستخدمين الذين يفتحون رابط تسجيل الدخول على نفس الجهاز الذي يطلبون فيه الارتباط، عن طريق تخزين عنوان بريدهم الإلكتروني محليًا - على سبيل المثال باستخدام 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 Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير auth ، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.

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

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

await FirebaseAuth.instance.signOut();