إذا كنت قد أجريت ترقية إلى خدمة "المصادقة عبر Firebase" باستخدام Identity Platform، يمكنك إضافة ميزة "المصادقة المتعدّدة العوامل" عبر الرسائل القصيرة إلى تطبيق Flutter.
تزيد المصادقة المتعدّدة العوامل (MFA) من أمان تطبيقك، ففي حين أنّ المهاجمين غالبًا ما يخترقون كلمات المرور والحسابات على وسائل التواصل الاجتماعي، يصعب عليهم اعتراض الرسائل النصية.
قبل البدء
فعِّل موفّرًا واحدًا على الأقل يتيح المصادقة المتعدّدة العوامل. يتيح كل موفّر خدمة المصادقة المتعددة العوامل، باستثناء مصادقة الهاتف والمصادقة بدون تحديد الهوية وApple Game Center.
تأكَّد من أنّ تطبيقك يتحقّق من عناوين البريد الإلكتروني للمستخدمين. تتطلّب المصادقة المتعدّدة العوامل تأكيد عنوان البريد الإلكتروني. يمنع ذلك الجهات الضارة من التسجيل في إحدى الخدمات باستخدام عنوان بريد إلكتروني لا تملكه، ثم حظر المالك الحقيقي من خلال إضافة عامل مصادقة ثانٍ.
Android: إذا لم يسبق لك ضبط تجزئة SHA-256 لتطبيقك في وحدة تحكّم Firebase، عليك إجراء ذلك. يمكنك الاطّلاع على مصادقة العميل للحصول على معلومات حول كيفية العثور على تجزئة SHA-256 لتطبيقك.
نظام التشغيل iOS: في Xcode، فعِّل الإشعارات الفورية لمشروعك وتأكَّد من إعداد مفتاح مصادقة APNs باستخدام خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" (FCM). بالإضافة إلى ذلك، يجب تفعيل أوضاع الخلفية للإشعارات عن بُعد. للاطّلاع على شرح مفصّل لهذه الخطوة، يُرجى الاطّلاع على مستندات مصادقة Firebase عبر الهاتف على iOS.
الويب: تأكَّد من إضافة نطاق تطبيقاتك على وحدة تحكّم 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/main/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: (_) {},
);
تهانينا! تم تسجيل عامل مصادقة ثانٍ للمستخدم بنجاح.
تسجيل دخول المستخدمين باستخدام عامل ثانٍ
لتسجيل دخول مستخدم باستخدام ميزة التحقّق بخطوتين عبر الرسائل القصيرة، اتّبِع الخطوات التالية:
سجِّل دخول المستخدم باستخدام العامل الأول، ثمّ سجِّل استثناء
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/main/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) {
...
}
تهانينا! تم تسجيل دخول مستخدم بنجاح باستخدام المصادقة المتعدّدة العوامل.
الخطوات التالية
- إدارة المستخدمين الذين فعّلوا المصادقة المتعدّدة العوامل برمجيًا باستخدام Admin SDK