يمكنك استخدام مصادقة Firebase لتسجيل الدخول إلى مستخدم عن طريق إرسال بريد إلكتروني إليه يحتوي على رابط ، والذي يمكنه النقر عليه لتسجيل الدخول. في هذه العملية ، يتم أيضًا التحقق من عنوان البريد الإلكتروني للمستخدم.
هناك فوائد عديدة لتسجيل الدخول عبر البريد الإلكتروني:
- انخفاض الاحتكاك في الاشتراك وتسجيل الدخول.
- تقليل مخاطر إعادة استخدام كلمة المرور عبر التطبيقات ، مما قد يقوض أمان حتى كلمات المرور المختارة جيدًا.
- القدرة على مصادقة مستخدم أثناء التحقق أيضًا من أن المستخدم هو المالك الشرعي لعنوان البريد الإلكتروني.
- يحتاج المستخدم فقط إلى حساب بريد إلكتروني يمكن الوصول إليه لتسجيل الدخول. لا يلزم ملكية رقم هاتف أو حساب وسائط اجتماعية.
- يمكن للمستخدم تسجيل الدخول بأمان دون الحاجة إلى تقديم (أو تذكر) كلمة مرور ، والتي يمكن أن تكون مرهقة على جهاز محمول.
- يمكن ترقية المستخدم الحالي الذي قام بتسجيل الدخول مسبقًا باستخدام معرف بريد إلكتروني (كلمة مرور أو موحد) لتسجيل الدخول باستخدام البريد الإلكتروني فقط. على سبيل المثال ، لا يزال بإمكان المستخدم الذي نسى كلمة المرور الخاصة به تسجيل الدخول دون الحاجة إلى إعادة تعيين كلمة المرور الخاصة به.
قبل ان تبدأ
قم بإعداد مشروع Android الخاص بك
أضف Firebase إلى مشروع Android ، إذا لم تكن قد قمت بذلك بالفعل.
في ملف Gradle (على مستوى التطبيق) للوحدة النمطية (عادةً ما يكون
<project>/<app-module>/build.gradle
) ، أضف تبعية مكتبة Firebase Authentication Android. نوصي باستخدام Firebase Android BoM للتحكم في إصدارات المكتبة.أيضًا ، كجزء من إعداد مصادقة Firebase ، تحتاج إلى إضافة SDK لخدمات Google Play إلى تطبيقك.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.0') // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth-ktx'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.5.0' }باستخدام Firebase Android BoM ، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Firebase Android.
(بديل) أضف تبعيات مكتبة Firebase بدون استخدام BoM
إذا اخترت عدم استخدام Firebase BoM ، فيجب عليك تحديد كل إصدار من إصدارات مكتبة Firebase في سطر التبعية الخاص بها.
لاحظ أنه إذا كنت تستخدم مكتبات Firebase متعددة في تطبيقك ، فإننا نوصي بشدة باستخدام BoM لإدارة إصدارات المكتبة ، مما يضمن توافق جميع الإصدارات.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth-ktx:22.0.0'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.5.0' }Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.0') // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.5.0' }باستخدام Firebase Android BoM ، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Firebase Android.
(بديل) أضف تبعيات مكتبة Firebase بدون استخدام BoM
إذا اخترت عدم استخدام Firebase BoM ، فيجب عليك تحديد كل إصدار من إصدارات مكتبة Firebase في سطر التبعية الخاص بها.
لاحظ أنه إذا كنت تستخدم مكتبات Firebase متعددة في تطبيقك ، فإننا نوصي بشدة باستخدام BoM لإدارة إصدارات المكتبة ، مما يضمن توافق جميع الإصدارات.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth:22.0.0'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.5.0' }
تفعيل تسجيل الدخول إلى رابط البريد الإلكتروني لمشروع Firebase
لتسجيل دخول المستخدمين عن طريق رابط البريد الإلكتروني ، يجب أولاً تمكين طريقة تسجيل الدخول إلى موفر البريد الإلكتروني ورابط البريد الإلكتروني لمشروع Firebase:
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر البريد الإلكتروني / كلمة المرور . لاحظ أنه يجب تمكين تسجيل الدخول إلى البريد الإلكتروني / كلمة المرور لاستخدام تسجيل الدخول إلى رابط البريد الإلكتروني.
- في نفس القسم ، قم بتمكين طريقة تسجيل الدخول لرابط البريد الإلكتروني (تسجيل الدخول بدون كلمة مرور) .
- انقر فوق حفظ .
أرسل ارتباط المصادقة إلى عنوان البريد الإلكتروني للمستخدم
لبدء تدفق المصادقة ، قدم للمستخدم واجهة تطالب المستخدم بتقديم عنوان بريده الإلكتروني ثم اتصل بـ sendSignInLinkToEmail
لمطالبة Firebase بإرسال رابط المصادقة إلى البريد الإلكتروني للمستخدم.
أنشئ كائن ActionCodeSettings ، والذي يزود Firebase بإرشادات حول كيفية إنشاء رابط البريد الإلكتروني. قم بتعيين الحقول التالية:
-
url
: الرابط لموضع معين للتضمين وأي حالة إضافية يتم تمريرها. يجب وضع نطاق الرابط في القائمة البيضاء في قائمة Firebase Console للنطاقات المصرح بها ، والتي يمكن العثور عليها بالانتقال إلى علامة تبويب طريقة تسجيل الدخول (المصادقة -> طريقة تسجيل الدخول). سيعيد الرابط توجيه المستخدم إلى عنوان URL هذا إذا لم يتم تثبيت التطبيق على أجهزتهم وتعذر تثبيت التطبيق. -
androidPackageName
وIOSBundleId
: التطبيقات المراد استخدامها عند فتح رابط تسجيل الدخول على جهاز Android أو Apple. تعرف على المزيد حول كيفية تكوين روابط Firebase الديناميكية لفتح روابط إجراءات البريد الإلكتروني عبر تطبيقات الجوال. -
handleCodeInApp
: اضبط على صواب. يجب أن تكتمل عملية تسجيل الدخول دائمًا في التطبيق بخلاف إجراءات البريد الإلكتروني الأخرى خارج النطاق (إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني). هذا لأنه في نهاية التدفق ، من المتوقع أن يقوم المستخدم بتسجيل الدخول واستمرار حالة المصادقة داخل التطبيق. -
dynamicLinkDomain
: عندما يتم تحديد عدة نطاقات ارتباط ديناميكي مخصصة لمشروع ما ، حدد أي واحد يتم استخدامه عند فتح الرابط عبر تطبيق جوال محدد (على سبيل المثال ،example.page.link
). وإلا يتم تحديد المجال الأول تلقائيًا.
Kotlin+KTX
val actionCodeSettings = 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 setIOSBundleId("com.example.ios") setAndroidPackageName( "com.example.android", true, // installIfNotAvailable "12", // minimumVersion ) }
Java
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder() // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. .setUrl("https://www.example.com/finishSignUp?cartId=1234") // This must be true .setHandleCodeInApp(true) .setIOSBundleId("com.example.ios") .setAndroidPackageName( "com.example.android", true, /* installIfNotAvailable */ "12" /* minimumVersion */) .build();
لمعرفة المزيد حول ActionCodeSettings ، راجع حالة المرور في قسم إجراءات البريد الإلكتروني .
-
اسأل المستخدم عن بريده الإلكتروني.
أرسل رابط المصادقة إلى البريد الإلكتروني للمستخدم ، واحفظ البريد الإلكتروني للمستخدم في حال أكمل المستخدم تسجيل الدخول عبر البريد الإلكتروني على نفس الجهاز.
Kotlin+KTX
Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Email sent.") } }
Java
FirebaseAuth auth = FirebaseAuth.getInstance(); auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d(TAG, "Email sent."); } } });
أكمل تسجيل الدخول باستخدام رابط البريد الإلكتروني
مخاوف أمنية
لمنع استخدام رابط تسجيل الدخول لتسجيل الدخول كمستخدم غير مقصود أو على جهاز غير مقصود ، يتطلب Firebase Auth توفير عنوان البريد الإلكتروني للمستخدم عند إكمال تدفق تسجيل الدخول. لكي ينجح تسجيل الدخول ، يجب أن يتطابق عنوان البريد الإلكتروني هذا مع العنوان الأصلي الذي تم إرسال رابط تسجيل الدخول إليه.
يمكنك تبسيط هذا التدفق للمستخدمين الذين يفتحون ارتباط تسجيل الدخول على نفس الجهاز الذي يطلبونه من خلال تخزين عنوان بريدهم الإلكتروني محليًا - على سبيل المثال باستخدام SharedPreferences - عند إرسال البريد الإلكتروني لتسجيل الدخول. ثم استخدم هذا العنوان لإكمال التدفق. لا تمرر البريد الإلكتروني للمستخدم في معلمات عنوان URL لإعادة التوجيه وأعد استخدامه لأن هذا قد يؤدي إلى تمكين حقن الجلسة.
بعد اكتمال تسجيل الدخول ، ستتم إزالة أي آلية سابقة لتسجيل الدخول لم يتم التحقق منها من المستخدم وسيتم إبطال أي جلسات حالية. على سبيل المثال ، إذا قام شخص ما مسبقًا بإنشاء حساب لم يتم التحقق منه بنفس البريد الإلكتروني وكلمة المرور ، فستتم إزالة كلمة مرور المستخدم لمنع منتحل الشخصية الذي ادعى الملكية وأنشأ هذا الحساب الذي لم يتم التحقق منه من تسجيل الدخول مرة أخرى باستخدام البريد الإلكتروني وكلمة المرور اللذين لم يتم التحقق منهما.
تأكد أيضًا من استخدام عنوان HTTPS URL في الإنتاج لتجنب احتمال اعتراض الخوادم الوسيطة للرابط الخاص بك.
استكمال تسجيل الدخول في تطبيق Android
تستخدم مصادقة Firebase روابط Firebase الديناميكية لإرسال رابط البريد الإلكتروني إلى جهاز محمول. لإكمال تسجيل الدخول عبر تطبيق الهاتف المحمول ، يجب تهيئة التطبيق لاكتشاف ارتباط التطبيق الوارد وتحليل الارتباط العميق الأساسي ثم إكمال تسجيل الدخول.
تكوين روابط Firebase الديناميكية
يستخدم Firebase Auth روابط Firebase الديناميكية عند إرسال رابط من المفترض أن يتم فتحه في تطبيق جوال. لاستخدام هذه الميزة ، يجب تكوين الروابط الديناميكية في Firebase Console.
تفعيل روابط Firebase الديناميكية:
- في وحدة تحكم Firebase ، افتح قسم الروابط الديناميكية .
إذا لم تكن قد وافقت بعد على شروط الروابط الديناميكية وأنشأت نطاق روابط ديناميكية ، فافعل ذلك الآن.
إذا كنت قد أنشأت بالفعل مجال روابط ديناميكية ، فقم بتدوين ذلك. عادة ما يبدو مجال الروابط الديناميكية مثل المثال التالي:
example.page.link
ستحتاج إلى هذه القيمة عند تكوين تطبيق Apple أو Android لاعتراض الرابط الوارد.
تكوين تطبيقات Android:
- للتعامل مع هذه الروابط من تطبيق Android الخاص بك ، يجب تحديد اسم حزمة Android في إعدادات مشروع Firebase Console. بالإضافة إلى ذلك ، يجب توفير SHA-1 و SHA-256 لشهادة التطبيق.
- الآن بعد أن أضفت مجال ارتباط ديناميكي وتأكدت من تكوين تطبيق Android الخاص بك بشكل صحيح ، سيعيد الارتباط الديناميكي التوجيه إلى تطبيقك ، بدءًا من نشاط المشغل.
- إذا كنت تريد أن يعيد الرابط الديناميكي التوجيه إلى نشاط معين ، فستحتاج إلى تكوين عامل تصفية الهدف في ملف AndroidManifest.xml الخاص بك. يمكن القيام بذلك إما عن طريق تحديد مجال الارتباط الديناميكي الخاص بك أو معالج إجراء البريد الإلكتروني في عامل تصفية الهدف. بشكل افتراضي ، تتم استضافة معالج إجراء البريد الإلكتروني على مجال مثل المثال التالي:
PROJECT_ID.firebaseapp.com/
- تحفظات:
- لا تحدد عنوان URL الذي قمت بتعيينه في actionCodeSettings في عامل تصفية الهدف الخاص بك.
- عند إنشاء مجال الارتباط الديناميكي الخاص بك ، ربما تكون قد أنشأت أيضًا رابط URL قصيرًا. لن يتم تمرير عنوان URL المختصر هذا ؛ لا تقم بتكوين مرشح النية الخاص بك للقبض عليه باستخدام سمة
android:pathPrefix
. هذا يعني أنك لن تكون قادرًا على التقاط روابط ديناميكية مختلفة في أجزاء مختلفة من التطبيق الخاص بك. ومع ذلك ، يمكنك التحقق من معلمة استعلامmode
في الرابط لمعرفة العملية التي تحاول تنفيذها ، أو استخدام طرق SDK مثلisSignInWithEmailLink
لمعرفة ما إذا كان الارتباط الذي استلمه تطبيقك يفعل ما تريد.
- لمزيد من المعلومات حول تلقي الروابط الديناميكية ، راجع تعليمات تلقي روابط Android الديناميكية .
تحقق من الارتباط وقم بتسجيل الدخول
بعد تلقي الارتباط كما هو موضح أعلاه ، تحقق من أنه مخصص لمصادقة ارتباط البريد الإلكتروني وأكمل تسجيل الدخول.
Kotlin+KTX
val auth = Firebase.auth val intent = intent val emailLink = intent.data.toString() // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it val email = "someemail@domain.com" // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully signed in with email link!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.exception) } } }
Java
FirebaseAuth auth = FirebaseAuth.getInstance(); Intent intent = getIntent(); String emailLink = intent.getData().toString(); // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it String email = "someemail@domain.com"; // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully signed in with email link!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.getException()); } } }); }
لمعرفة المزيد حول كيفية التعامل مع تسجيل الدخول باستخدام رابط البريد الإلكتروني في تطبيق Apple ، راجع دليل أنظمة تشغيل Apple .
للتعرف على كيفية التعامل مع تسجيل الدخول باستخدام ارتباط البريد الإلكتروني في تطبيق ويب ، راجع دليل الويب .
ربط / إعادة المصادقة برابط البريد الإلكتروني
يمكنك أيضًا ربط طريقة المصادقة هذه بمستخدم حالي. على سبيل المثال ، يمكن لمستخدم تمت مصادقته مسبقًا مع موفر آخر ، مثل رقم الهاتف ، إضافة طريقة تسجيل الدخول هذه إلى حسابه الحالي.
سيكون الفرق في النصف الثاني من العملية:
Kotlin+KTX
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Link the credential to the current user. Firebase.auth.currentUser!!.linkWithCredential(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully linked emailLink credential!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.exception) } }
Java
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Link the credential to the current user. auth.getCurrentUser().linkWithCredential(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully linked emailLink credential!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.getException()); } } });
يمكن أيضًا استخدام هذا لإعادة مصادقة مستخدم رابط البريد الإلكتروني قبل تشغيل عملية حساسة.
Kotlin+KTX
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Re-authenticate the user with this credential. Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.exception) } }
Java
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Re-authenticate the user with this credential. auth.getCurrentUser().reauthenticateAndRetrieveData(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.getException()); } } });
ومع ذلك ، نظرًا لأن التدفق قد ينتهي على جهاز مختلف حيث لم يتم تسجيل دخول المستخدم الأصلي ، فقد لا يكتمل هذا التدفق. في هذه الحالة ، يمكن أن يظهر خطأ للمستخدم لإجباره على فتح الرابط على نفس الجهاز. يمكن تمرير بعض الحالات في الارتباط لتوفير معلومات حول نوع العملية ومعرف المستخدم.
التفريق بين البريد الإلكتروني / كلمة المرور من رابط البريد الإلكتروني
في حال كنت تدعم كلاً من كلمة المرور وتسجيل الدخول المستند إلى الارتباط بالبريد الإلكتروني ، للتمييز بين طريقة تسجيل الدخول لكلمة مرور / مستخدم رابط ، استخدم fetchSignInMethodsForEmail
. يُعد هذا مفيدًا لعمليات تدفقات المعرف أولاً حيث يُطلب من المستخدم أولاً تقديم بريده الإلكتروني ثم تقديم طريقة تسجيل الدخول:
Kotlin+KTX
Firebase.auth.fetchSignInMethodsForEmail(email) .addOnSuccessListener { result -> val signInMethods = result.signInMethods!! if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } .addOnFailureListener { exception -> Log.e(TAG, "Error getting sign in methods for user", exception) }
Java
auth.fetchSignInMethodsForEmail(email) .addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() { @Override public void onComplete(@NonNull Task<SignInMethodQueryResult> task) { if (task.isSuccessful()) { SignInMethodQueryResult result = task.getResult(); List<String> signInMethods = result.getSignInMethods(); if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } else { Log.e(TAG, "Error getting sign in methods for user", task.getException()); } } });
كما هو موضح أعلاه ، يعتبر البريد الإلكتروني / كلمة المرور والبريد الإلكتروني / الرابط نفس EmailAuthProvider
(نفس PROVIDER_ID
) مع طرق مختلفة لتسجيل الدخول.
الخطوات التالية
بعد أن يقوم المستخدم بتسجيل الدخول لأول مرة ، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - المستخدم الذي قام بتسجيل الدخول باستخدام. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك ، ويمكن استخدامه لتحديد هوية مستخدم عبر كل تطبيق في مشروعك ، بغض النظر عن كيفية تسجيل المستخدم للدخول.
في تطبيقاتك ، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من كائن
FirebaseUser
. انظر إدارة المستخدمين .في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير
auth
، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم ، قم signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();