إذا تمت الترقية إلى مصادقة Firebase باستخدام النظام الأساسي للهوية، يمكنك إضافة مصادقة متعدّدة العوامل للرسائل القصيرة إلى تطبيق Flutter
تزيد المصادقة المتعدّدة العوامل (MFA) من مستوى أمان تطبيقك. لا شك في أنّ المهاجمين اختراق كلمات المرور والحسابات الاجتماعية غالبًا، فإن اعتراض رسالة نصية أكثر صعوبة.
قبل البدء
فعِّل موفّر خدمة واحدًا على الأقل يتيح المصادقة المتعدّدة العوامل. يتيح كل مقدّم خدمة المصادقة المتعدّدة القنوات (MFA)، باستثناء مصادقة الهاتف، والمصادقة المجهولة، Apple Game Center
تأكَّد من أنّ تطبيقك يتحقّق من عناوين البريد الإلكتروني للمستخدمين. تتطلب MFA إثبات ملكية عنوان البريد الإلكتروني. يؤدي ذلك إلى منع الجهات الضارّة من التسجيل في خدمة باستخدام عنوان بريد إلكتروني. التي لا تملكها، ثم نحظر المالك الحقيقي من خلال إضافة علامة .
Android: إذا لم يسبق لك ضبط تجزئة SHA-256 لتطبيقك في لوحدة تحكُّم Firebase، افعل ذلك. الاطّلاع على مصادقة البرنامج للحصول على معلومات حول العثور على تجزئة SHA-256 لتطبيقك.
iOS: في Xcode، يمكنك تفعيل الإشعارات الفورية لمشروعك. ضمان ضبط مفتاح مصادقة أسماء نقاط الوصول (APN) مع "المراسلة عبر السحابة الإلكترونية من Firebase" (FCM) بالإضافة إلى ذلك، يجب عليك تفعيل أوضاع الخلفية للإشعارات عن بُعد. للاطّلاع على شرح تفصيلي لهذه الخطوة، يمكنك الاطّلاع على مستندات مصادقة الهاتف بنظام التشغيل iOS من Firebase.
الويب: تأكَّد من إضافة نطاق تطبيقاتك إلى وحدة تحكُّم Firebase ضمن نطاقات إعادة توجيه OAuth.
تفعيل المصادقة المتعدّدة العوامل
افتح المصادقة > طريقة تسجيل الدخول بوحدة تحكُّم Firebase.
في القسم الإعدادات المتقدّمة، فعِّل المصادقة المتعدّدة العوامل للرسائل القصيرة.
يجب أيضًا إدخال أرقام الهواتف التي سيتم اختبار تطبيقك باستخدامها. على الرغم من أنّ تسجيل أرقام الهواتف المخصّصة للاختبار اختياريًا، يُنصح بشدة تجنب التقييد أثناء التطوير.
إذا لم يسبق لك تفويض نطاق تطبيقك، أضِفه إلى نطاق السماح. في قائمة المصادقة > الإعدادات بوحدة تحكُّم Firebase.
اختيار نمط التسجيل
يمكنك اختيار ما إذا كان تطبيقك يتطلب مصادقة متعدّدة العوامل، وكيفية ووقت تسجيل المستخدمين. وتشمل بعض الأنماط الشائعة ما يلي:
سجِّل العامل الثاني للمستخدم كجزء من التسجيل. استخدام هذه المسودة إذا كان تطبيقك يتطلب مصادقة متعددة العوامل لجميع المستخدمين.
عليك توفير خيار قابل للتخطّي لتسجيل عامل ثانٍ أثناء التسجيل. حملة التطبيقات التي تريد تشجيع إجراء مصادقة متعددة العوامل، ولكن لا تتطلبها، أو يفضلون هذا النهج.
توفير إمكانية إضافة عامل ثانٍ من حساب المستخدم أو ملفه الشخصي صفحة إدارة المشروعات بدلاً من شاشة التسجيل. يقلل هذا من الاحتكاك أثناء لعملية التسجيل، مع الاستمرار في إجراء مصادقة متعددة العوامل متاحة للمستخدمين الحساسين للأمان.
طلب إضافة عامل ثانٍ بشكل تدريجي عندما يريد المستخدم الوصول مع متطلبات أمان أعلى.
تسجيل عامل ثانٍ
لتسجيل عامل ثانوي جديد لمستخدم:
أعِد مصادقة المستخدم.
اطلب من المستخدم إدخال رقم هاتفه.
الحصول على جلسة متعددة العوامل للمستخدم:
final multiFactorSession = await user.multiFactor.getSession();
يمكنك إثبات ملكية رقم الهاتف من خلال جلسة متعددة العوامل وعمليات معاودة الاتصال:
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: multiFactorSession, phoneNumber: phoneNumber, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // The SMS verification code has been sent to the provided phone number. // ... }, codeAutoRetrievalTimeout: (_) {}, );
بعد إرسال رمز SMS، اطلب من المستخدم إثبات صحة الرمز باتّباع الخطوات التالية:
final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, );
أكمِل عملية التسجيل:
await user.multiFactor.enroll( PhoneMultiFactorGenerator.getAssertion( credential, ), );
يوضح الرمز أدناه مثالاً كاملاً لتسجيل عامل ثانٍ:
final session = await user.multiFactor.getSession();
final auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
multiFactorSession: session,
phoneNumber: phoneController.text,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/master/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await user.multiFactor.enroll(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
تهانينا لقد سجَّلت بنجاح عامل مصادقة ثانٍ مستخدم.
تسجيل دخول المستخدمين بعامل ثانٍ
لتسجيل دخول مستخدم باستخدام ميزة إثبات الهوية عبر الرسائل القصيرة SMS:
سجّل دخول المستخدم بعامله الأول، ثم اكتشف استثناء واحد (
FirebaseAuthMultiFactorException
). يحتوي هذا الخطأ على الذي يمكنك استخدامه لمعرفة العوامل الثانية المسجَّلة للمستخدم. تحتوي أيضًا على جلسة أساسية تثبت أنّ المستخدم نجح في مع عاملها الأول.على سبيل المثال، إذا كان العامل الأول للمستخدم هو البريد الإلكتروني وكلمة المرور:
try { await _auth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text, ); // User is not enrolled with a second factor and is successfully // signed in. // ... } on FirebaseAuthMultiFactorException catch (e) { // The user is a multi-factor user. Second factor challenge is required final resolver = e.resolver // ... }
إذا كان المستخدم لديه عدة عوامل ثانوية تم تسجيلها، اسأله عن العوامل الثانوية. للاستخدام:
final session = e.resolver.session; final hint = e.resolver.hints[selectedHint];
أرسل رسالة تحقق إلى هاتف المستخدم تحتوي على التلميح الجلسة متعددة العوامل:
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: session, multiFactorInfo: hint, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // ... }, codeAutoRetrievalTimeout: (_) {}, );
يمكنك الاتصال بالرقم
resolver.resolveSignIn()
لإكمال المصادقة الثانوية:final smsCode = await getSmsCodeFromUser(context); if (smsCode != null) { // Create a PhoneAuthCredential with the code final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, ); try { await e.resolver.resolveSignIn( PhoneMultiFactorGenerator.getAssertion(credential) ); } on FirebaseAuthException catch (e) { print(e.message); } }
يوضح الرمز أدناه مثالاً كاملاً لتسجيل دخول مستخدم متعدد العوامل:
try {
await _auth.signInWithEmailAndPassword(
email: emailController.text,
password: passwordController.text,
);
} on FirebaseAuthMultiFactorException catch (e) {
setState(() {
error = '${e.message}';
});
final firstHint = e.resolver.hints.first;
if (firstHint is! PhoneMultiFactorInfo) {
return;
}
await FirebaseAuth.instance.verifyPhoneNumber(
multiFactorSession: e.resolver.session,
multiFactorInfo: firstHint,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/master/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await e.resolver.resolveSignIn(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
} catch (e) {
...
}
تهانينا تم تسجيل دخول مستخدم بنجاح باستخدام عوامل متعددة المصادقة.
الخطوات التالية
- إدارة المستخدمين المتعددي العوامل آليًا باستخدام SDK للمشرف.