يمكنك استخدام "مصادقة Firebase" لتسجيل دخول مستخدم من خلال إرسال رسالة إلكترونية إليه تحتوي على رابط يمكنه النقر عليه لتسجيل الدخول. وفي هذه العملية، يتم أيضًا إثبات عنوان البريد الإلكتروني للمستخدم.
هناك العديد من المزايا لتسجيل الدخول باستخدام البريد الإلكتروني:
- تسجيل الدخول والاشتراك بسهولة
- انخفاض خطر إعادة استخدام كلمة المرور نفسها في تطبيقات مختلفة، ما قد يؤدي إلى تقليل مستوى الأمان حتى لكلمات المرور التي تم اختيارها بعناية
- إمكانية مصادقة المستخدم مع إثبات أنّه المالك الشرعي لعنوان البريد الإلكتروني
- لا يحتاج المستخدم إلا إلى حساب بريد إلكتروني يمكن الوصول إليه لتسجيل الدخول. ولا يُشترط امتلاك رقم هاتف أو حساب على وسائل التواصل الاجتماعي.
- يمكن للمستخدم تسجيل الدخول بأمان بدون الحاجة إلى تقديم كلمة مرور (أو تذكّرها)، ما قد يكون أمرًا صعبًا على الجهاز الجوّال.
- يمكن ترقية حساب مستخدم حالي سبق له تسجيل الدخول باستخدام معرّف بريد إلكتروني (كلمة مرور أو حساب موحّد) لتسجيل الدخول باستخدام البريد الإلكتروني فقط. على سبيل المثال، يمكن للمستخدم الذي نسي كلمة المرور تسجيل الدخول بدون الحاجة إلى إعادة ضبطها.
قبل البدء
استخدِم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.
- في Xcode، افتح مشروع تطبيقك وانتقِل إلى ملف > إضافة حِزم.
- عندما يُطلب منك ذلك، أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase على Apple:
- اختَر مكتبة Firebase Authentication.
- أضِف العلامة
-ObjCإلى قسم علامات الرابط الأخرى في إعدادات الإصدار للهدف. - عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ التبعيات وتنزيلها في الخلفية.
https://github.com/firebase/firebase-ios-sdk.git
تفعيل ميزة تسجيل الدخول باستخدام رابط البريد الإلكتروني لمشروعك على Firebase
لتسجيل دخول المستخدمين باستخدام رابط البريد الإلكتروني، يجب أولاً تفعيل موفِّر البريد الإلكتروني وطريقة تسجيل الدخول باستخدام رابط البريد الإلكتروني لمشروعك على Firebase:
في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
في علامة التبويب طريقة تسجيل الدخول ، فعِّل موفِّر تسجيل الدخول البريد الإلكتروني/كلمة المرور. يُرجى العِلم أنّه يجب تفعيل تسجيل الدخول باستخدام البريد الإلكتروني/كلمة المرور لاستخدام تسجيل الدخول باستخدام رابط البريد الإلكتروني.
في القسم نفسه، فعِّل موفِّر رابط البريد الإلكتروني (تسجيل الدخول بدون كلمة مرور).
انقر على حفظ.
إرسال رابط مصادقة إلى عنوان البريد الإلكتروني للمستخدم
لبدء عملية المصادقة، اعرض على المستخدم واجهة تطلب منه تقديم عنوان بريده الإلكتروني، ثم استدعِ الدالة sendSignInLink لطلب إرسال رابط المصادقة إلى عنوان البريد الإلكتروني للمستخدم من Firebase.
أنشئ عنصر
ActionCodeSettingsالذي يزوّد Firebase بتعليمات حول كيفية إنشاء رابط البريد الإلكتروني. اضبط الحقول التالية:url: الرابط لصفحة معيّنة في التطبيق الذي سيتم تضمينه وأي حالة إضافية سيتم تمريرها. أضِف نطاقك إلى قائمة النطاقات المفوّضة إذا لم يسبق لك إجراء ذلك:في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب الأمان > المصادقة > الإعدادات.
في قسم النطاقات المفوّضة ، انقر على إضافة نطاق وأضِف نطاقك.
iOSBundleIDوandroidPackageName: يساعدان Firebase Authentication في تحديد ما إذا كان يجب إنشاء رابط للويب فقط أو رابط للأجهزة الجوّالة يتم فتحه على جهاز Android أو Apple.handleCodeInApp: اضبط القيمة على "صحيح". يجب دائمًا إكمال عملية تسجيل الدخول في التطبيق على عكس إجراءات البريد الإلكتروني الأخرى خارج النطاق (إعادة ضبط كلمة المرور وعمليات إثبات عنوان البريد الإلكتروني). ويرجع ذلك إلى أنّه من المتوقّع أن يكون المستخدم مسجّلاً الدخول في نهاية العملية وأن تظل حالة المصادقة محفوظة في التطبيق.linkDomain: عند تحديد نطاقات روابط مخصّصة Hosting لمشروع، حدِّد النطاق الذي سيتم استخدامه عندما يفتح تطبيق جوّال محدّد الرابط. وإلا، سيتم اختيار النطاق التلقائي تلقائيًا (على سبيل المثال، ).PROJECT_ID.firebaseapp.comdynamicLinkDomain: تم إيقاف هذه المَعلمة نهائيًا. لا تحدِّد هذه المَعلمة.
Swift
let actionCodeSettings = ActionCodeSettings() actionCodeSettings.url = URL(string: "https://www.example.com") // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.setAndroidPackageName("com.example.android", installIfNotAvailable: false, minimumVersion: "12")
Objective-C
FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init]; [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]]; // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = YES; [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]]; [actionCodeSettings setAndroidPackageName:@"com.example.android" installIfNotAvailable:NO minimumVersion:@"12"];
لمزيد من المعلومات عن
ActionCodeSettings، يُرجى الرجوع إلى قسم تمرير الحالة في إجراءات البريد الإلكتروني.اطلب من المستخدم عنوان بريده الإلكتروني.
أرسِل رابط المصادقة إلى عنوان البريد الإلكتروني للمستخدم، واحفظ عنوان البريد الإلكتروني للمستخدم في حال أكمل المستخدم عملية تسجيل الدخول باستخدام البريد الإلكتروني على الجهاز نفسه.
Swift
Auth.auth().sendSignInLink(toEmail: email, actionCodeSettings: actionCodeSettings) { error in // ... if let error = error { self.showMessagePrompt(error.localizedDescription) return } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. UserDefaults.standard.set(email, forKey: "Email") self.showMessagePrompt("Check your email for link") // ... }
Objective-C
[[FIRAuth auth] sendSignInLinkToEmail:email actionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) { // ... if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"]; [self showMessagePrompt:@"Check your email for link"]; // ... }];
إكمال عملية تسجيل الدخول باستخدام رابط البريد الإلكتروني
المخاوف المرتبطة بالأمان
لمنع استخدام رابط تسجيل الدخول لتسجيل الدخول كمستخدم غير مقصود أو على جهاز غير مقصود، تطلب "مصادقة Firebase" تقديم عنوان البريد الإلكتروني للمستخدم عند إكمال عملية تسجيل الدخول. ولكي تنجح عملية تسجيل الدخول، يجب أن يتطابق عنوان البريد الإلكتروني هذا مع العنوان الذي تم إرسال رابط تسجيل الدخول إليه في الأصل.
يمكنك تبسيط هذه العملية للمستخدمين الذين يفتحون رابط تسجيل الدخول على الجهاز نفسه الذي يطلبون الرابط عليه، وذلك من خلال تخزين عنوان بريدهم الإلكتروني محليًا عند إرسال الرسالة الإلكترونية لتسجيل الدخول. بعد ذلك، استخدِم هذا العنوان لإكمال العملية.
بعد إكمال عملية تسجيل الدخول، ستتم إزالة أي آلية تسجيل دخول سابقة لم يتم إثباتها من حساب المستخدم وسيتم إبطال أي جلسات حالية. على سبيل المثال، إذا سبق لأحد المستخدمين إنشاء حساب لم يتم إثباته باستخدام عنوان البريد الإلكتروني وكلمة المرور نفسَيهما، ستتم إزالة كلمة مرور المستخدم لمنع المنتحل الذي ادّعى ملكية هذا الحساب غير المثبت وأنشأه من تسجيل الدخول مرة أخرى باستخدام الحساب نفسه.
إكمال عملية تسجيل الدخول في تطبيق Apple للأجهزة الجوّالة
Firebase Authentication تستخدِم Firebase Hosting لإرسال رابط البريد الإلكتروني إلى جهاز جوّال. لإكمال عملية تسجيل الدخول باستخدام تطبيق جوّال، يجب ضبط التطبيق لرصد رابط التطبيق الوارد وتحليل الرابط لصفحة معيّنة في التطبيق الأساسي ثم إكمال عملية تسجيل الدخول. يمكنك الاطّلاع على الـ روابط العامة والنطاقات المرتبطة على iOS لمزيد من التفاصيل حول كيفية إجراء ذلك.
ضبط Firebase Hosting
Firebase Authentication تستخدِم نطاقات Firebase Hosting عند إنشاء وإرسال رابط يُفترض فتحه في تطبيق جوّال. تمّ ضبط نطاق تلقائي Firebase Hosting لك من قبل.
اضبط نطاقات Firebase Hosting:
في وحدة تحكّم Firebase، انتقِل إلى الاستضافة والخدمات بلا خادم > الاستضافة.
إذا كنت تريد استخدام النطاق التلقائي لرابط البريد الإلكتروني الذي يتم فتحه في تطبيقات الأجهزة الجوّالة، انتقِل إلى موقعك الإلكتروني التلقائي واحتفظ بنسخة من نطاق Hosting التلقائي. يبدو نطاق Hosting التلقائي عادةً على النحو التالي:
.PROJECT_ID.firebaseapp.comستحتاج إلى هذه القيمة عند ضبط تطبيقك لاعتراض الرابط الوارد.
إذا كنت تريد استخدام نطاق مخصّص لرابط البريد الإلكتروني، يمكنك تسجيل نطاق في Firebase Hosting واستخدامه لنطاق الرابط.
ضبط تطبيقات Apple:
عليك ضبط النطاق الذي اخترته كـ نطاق مرتبط لروابط التطبيقات. لإعداد الاستحقاق في تطبيقك، افتح علامة التبويب التوقيع والإمكانات للهدف في Xcode وأضِف نطاقات "استضافة Firebase" من الخطوة السابقة إلى إمكانية "النطاقات المرتبطة". إذا كنت تستخدم النطاق التلقائي، سيكون هذا
.Firebase Hostingapplinks:PROJECT_ID.firebaseapp.comيمكنك الاطّلاع على مقالة دعم النطاقات المرتبطة على موقع مستندات Apple الإلكتروني لمزيد من المعلومات.
إثبات صحة الرابط وتسجيل الدخول
بعد تلقّي الرابط كما هو موضّح أعلاه، تحقَّق من أنّه مخصّص للمصادقة باستخدام رابط البريد الإلكتروني وأكمِل عملية تسجيل الدخول.
Swift
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objective-C
if ([[FIRAuth auth] isSignInWithEmailLink:link]) { [[FIRAuth auth] signInWithEmail:email link:link completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; }
للتعرّف على كيفية التعامل مع تسجيل الدخول باستخدام رابط البريد الإلكتروني في تطبيق Android ، يُرجى الرجوع إلى دليل Android.
للتعرّف على كيفية التعامل مع تسجيل الدخول باستخدام رابط البريد الإلكتروني في تطبيق ويب ، يُرجى الرجوع إلى دليل الويب.
ربط الحساب/إعادة المصادقة باستخدام رابط البريد الإلكتروني
يمكنك أيضًا ربط طريقة المصادقة هذه بمستخدم حالي. على سبيل المثال، يمكن للمستخدم الذي سبق له المصادقة باستخدام موفِّر آخر، مثل رقم هاتف، إضافة طريقة تسجيل الدخول هذه إلى حسابه الحالي.
سيظهر الاختلاف في النصف الثاني من العملية:
Swift
let credential = EmailAuthCredential.credential(withEmail:email link:link) Auth.auth().currentUser?.link(with: credential) { authData, error in if (error) { // And error occurred during linking. return } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; [FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during linking. return; } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }];
يمكن أيضًا استخدام هذه الطريقة لإعادة مصادقة مستخدم رابط البريد الإلكتروني قبل تشغيل عملية حساسة.
Swift
let credential = EmailAuthProvider.credential(withEmail:email link:link) Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in if (error) { // And error occurred during re-authentication. return } // The user was successfully re-authenticated. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthCredential credentialWithEmail:email link:link]; [FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during re-authentication return; } // The user was successfully re-authenticated. }];
ومع ذلك، بما أنّ العملية قد تنتهي على جهاز مختلف لم يكن المستخدم الأصلي مُسجِّل الدخول فيه، قد لا يتم إكمال هذه العملية. في هذه الحالة، يمكن عرض رسالة خطأ للمستخدم لإجباره على فتح الرابط على الجهاز نفسه. يمكن تمرير بعض الحالات في الرابط لتقديم معلومات عن نوع العملية ورقم تعريف المستخدم.
تم إيقاف هذه الميزة نهائيًا: عملية إثبات الهوية المستندة إلى Firebase Dynamic Links
قبل إصدار Firebase Authentication iOS SDK v11.8.0، كانت ميزة تسجيل الدخول باستخدام رابط البريد الإلكتروني تعتمد على Firebase Dynamic Links لفتح روابط تسجيل الدخول في التطبيق الصحيح. تم إيقاف روابط إثبات الهوية هذه نهائيًا، لأنّه سيتم إيقاف Firebase Dynamic Links في 25 أغسطس 2025.
إذا كان تطبيقك يستخدم الروابط القديمة، عليك نقل تطبيقك إلى النظام الجديد المستند إلى Firebase Hosting.
تم إيقاف هذه الميزة نهائيًا: التمييز بين تسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور وتسجيل الدخول باستخدام رابط البريد الإلكتروني
إذا أنشأت مشروعك في 15 سبتمبر 2023 أو بعد هذا التاريخ، تكون ميزة الحماية من تعداد عناوين البريد الإلكتروني مفعّلة تلقائيًا. تُحسِّن هذه الميزة أمان حسابات المستخدمين في مشروعك، ولكنّها توقف طريقة fetchSignInMethodsForEmail()، التي سبق أن نصحنا بتنفيذ عمليات تسجيل الدخول التي تبدأ بالمعرّف.
على الرغم من أنّه يمكنك إيقاف ميزة الحماية من تعداد عناوين البريد الإلكتروني لمشروعك، ننصحك بعدم إجراء ذلك.
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تفعيل ميزة الحماية من تعداد عناوين البريد الإلكتروني أو إيقافها.
الخطوات التالية
بعد أن يسجّل المستخدم الدخول للمرة الأولى، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد، أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفِّر المصادقة التي سجّل المستخدم الدخول بها. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase، ويمكن استخدامه لتحديد هوية المستخدم في كل تطبيق في مشروعك، بغض النظر عن طريقة تسجيل الدخول.
-
في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من عنصر
User. يمكنك الاطّلاع على مقالة إدارة المستخدمين. في Firebase Realtime Database وCloud Storage قواعد الأمان، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغيّر
auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام عدّة موفِّري مصادقة من خلال ربط بيانات اعتماد موفِّر المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم، استدعِ الدالة
signOut:.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
قد تحتاج أيضًا إلى إضافة رمز للتعامل مع الأخطاء من أجل النطاق الكامل لأخطاء المصادقة. يمكنك الاطّلاع على مقالة التعامل مع الأخطاء.