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