הוסף אימות רב-גורמי לאפליקציית Flutter שלך

אם שדרגת ל-Firebase Authentication with Identity Platform, תוכל להוסיף אימות רב-גורמי SMS לאפליקציית Flutter שלך.

אימות רב-גורמי (MFA) מגביר את האבטחה של האפליקציה שלך. בעוד שתוקפים מתפשרים לעתים קרובות על סיסמאות וחשבונות חברתיים, יירוט הודעת טקסט קשה יותר.

לפני שאתה מתחיל

  1. אפשר לפחות ספק אחד שתומך באימות רב-גורמי. כל ספק תומך ב-MFA, למעט אישור טלפוני, אישור אנונימי ומרכז המשחקים של Apple.

  2. ודא שהאפליקציה שלך מאמתת אימיילים של משתמשים. MFA דורש אימות דוא"ל. זה מונע משחקנים זדוניים להירשם לשירות עם אימייל שאינם בבעלותם, ולאחר מכן לנעול את הבעלים האמיתי על ידי הוספת גורם שני.

  3. אנדרואיד : אם עדיין לא הגדרת את ה-hash SHA-256 של האפליקציה שלך במסוף Firebase , עשה זאת. ראה אימות הלקוח שלך למידע על מציאת ה-hash SHA-256 של האפליקציה שלך.

  4. iOS : ב-Xcode, אפשר הודעות דחיפה עבור הפרויקט שלך וודא שמפתח האימות של ה-APN שלך מוגדר עם Firebase Cloud Messaging (FCM) . בנוסף, עליך להפעיל מצבי רקע עבור התראות מרחוק. כדי להציג הסבר מעמיק של שלב זה, עיין בתיעוד Firebase iOS Phone Auth .

  5. אינטרנט : ודא שהוספת את דומיין היישומים שלך במסוף Firebase , תחת דומיינים להפניה מחדש של OAuth .

הפעלת אימות מרובה גורמים

  1. פתח את הדף אימות > שיטת כניסה של מסוף Firebase.

  2. בקטע מתקדם , הפעל אימות רב-גורמי של SMS .

    עליך להזין גם את מספרי הטלפון שאיתם תבדוק את האפליקציה שלך. אמנם אופציונלי, אך מומלץ מאוד לרשום מספרי טלפון לבדיקה כדי למנוע מצערת במהלך הפיתוח.

  3. אם עדיין לא אישרת את הדומיין של האפליקציה שלך, הוסף אותו לרשימת ההיתרים בדף אימות > הגדרות של מסוף Firebase.

בחירת דפוס הרשמה

אתה יכול לבחור אם האפליקציה שלך דורשת אימות רב-גורמי, וכיצד ומתי לרשום את המשתמשים שלך. כמה דפוסים נפוצים כוללים:

  • רשום את הגורם השני של המשתמש כחלק מההרשמה. השתמש בשיטה זו אם האפליקציה שלך דורשת אימות רב-גורמי עבור כל המשתמשים.

  • הצע אפשרות ניתנת לדילוג כדי לרשום גורם שני במהלך ההרשמה. אפליקציות שרוצות לעודד, אך לא דורשות, אימות רב-גורמי עשויות להעדיף גישה זו.

  • ספק את היכולת להוסיף גורם שני מדף ניהול החשבון או הפרופיל של המשתמש, במקום מסך ההרשמה. זה ממזער את החיכוך במהלך תהליך הרישום, תוך מתן אימות רב-גורמי לזמין עבור משתמשים רגישים לאבטחה.

  • דרוש הוספת גורם שני בהדרגה כאשר המשתמש רוצה לגשת לתכונות עם דרישות אבטחה מוגברות.

רישום גורם שני

כדי לרשום גורם משני חדש עבור משתמש:

  1. אימות מחדש של המשתמש.

  2. בקשו מהמשתמש להזין את מספר הטלפון שלו.

  3. קבל הפעלה מרובה גורמים עבור המשתמש:

    final multiFactorSession = await user.multiFactor.getSession();
    
  4. אמת את מספר הטלפון עם הפעלה מרובה גורמים ושיחות חוזרות שלך:

    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: (_) {},
    ); 
    
  5. לאחר שליחת קוד ה-SMS, בקש מהמשתמש לאמת את הקוד:

    final credential = PhoneAuthProvider.credential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    
  6. השלם את ההרשמה:

    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:

  1. היכנס למשתמש עם הגורם הראשון שלו, ולאחר מכן תפס את חריג 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
      // ...
    }
    
  2. אם למשתמש רשומים מספר גורמים משניים, שאל אותו באיזה מהם להשתמש:

    final session = e.resolver.session;
    
    final hint = e.resolver.hints[selectedHint];
    
  3. שלח הודעת אימות לטלפון של המשתמש עם הרמז והפעלה מרובה גורמים:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: session,
      multiFactorInfo: hint,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    
  4. התקשר ל- 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) {
  ...
} 

מזל טוב! נכנסת בהצלחה למשתמש באמצעות אימות רב-גורמי.

מה הלאה