הוסף אימות TOTP מרובה גורמים לאפליקציית האינטרנט שלך

אם שדרגת ל-Firebase Authentication with Identity Platform, תוכל להוסיף סיסמה חד-פעמית מבוססת-זמן (TOTP) אימות רב-גורמי (MFA) לאפליקציה שלך.

אימות Firebase עם Identity Platform מאפשר לך להשתמש ב-TOTP כגורם נוסף עבור MFA. כאשר אתה מפעיל תכונה זו, משתמשים המנסים להיכנס לאפליקציה שלך רואים בקשה ל-TOTP. כדי ליצור אותו, עליהם להשתמש באפליקציית אימות המסוגלת ליצור קודי TOTP חוקיים, כגון Google Authenticator .

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

  1. אפשר לפחות ספק אחד שתומך ב-MFA. שימו לב שכל הספקים מלבד ה-MFA הבאים תומכים ב-MFA:

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

  3. אם עדיין לא עשית זאת, התקן את Firebase JavaScript SDK .

    TOTP MFA נתמך רק ב-Web SDK המודולרי, גרסאות v9.19.1 ומעלה.

אפשר TOTP MFA

כדי להפעיל TOTP כגורם שני, השתמש ב-Admin SDK או התקשר לנקודת הקצה REST של תצורת הפרויקט.

כדי להשתמש ב-Admin SDK, בצע את הפעולות הבאות:

  1. אם עדיין לא עשית זאת, התקן את Firebase Admin Node.js SDK .

    TOTP MFA נתמך רק ב-Firebase Admin Node.js SDK בגרסאות 11.6.0 ומעלה.

  2. הפעל את הפעולות הבאות:

    import { getAuth } from 'firebase-admin/auth';
    
    getAuth().projectConfigManager().updateProjectConfig(
    {
          multiFactorConfig: {
              providerConfigs: [{
                  state: "ENABLED",
                  totpProviderConfig: {
                      adjacentIntervals: {
                          NUM_ADJ_INTERVALS
                      },
                  }
              }]
          }
    })
    

    החלף את הדברים הבאים:

    • NUM_ADJ_INTERVALS : מספר מרווחי חלון הזמן הסמוכים שמהם ניתן לקבל TOTPs, מאפס עד עשרה. ברירת המחדל היא חמש.

      TOTPs פועלים על ידי הבטחה שכאשר שני צדדים (המוכיח והמאמת) יוצרים OTPs בתוך אותו חלון זמן (בדרך כלל באורך 30 שניות), הם יוצרים את אותה סיסמה. עם זאת, כדי להתאים את הסחף השעון בין הצדדים וזמן התגובה האנושי, אתה יכול להגדיר את שירות TOTP לקבל גם TOTP מחלונות סמוכים.

כדי להפעיל TOTP MFA באמצעות REST API, הפעל את הפעולות הבאות:

curl -X PATCH "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=mfa" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    -d \
    '{
        "mfa": {
          "providerConfigs": [{
            "state": "ENABLED",
            "totpProviderConfig": {
              "adjacentIntervals": "NUM_ADJ_INTERVALS"
            }
          }]
       }
    }'

החלף את הדברים הבאים:

  • PROJECT_ID : מזהה הפרויקט.
  • NUM_ADJ_INTERVALS : מספר מרווחי חלון הזמן, מאפס עד עשרה. ברירת המחדל היא חמש.

    TOTPs פועלים על ידי הבטחה שכאשר שני צדדים (המוכיח והמאמת) יוצרים OTPs בתוך אותו חלון זמן (בדרך כלל באורך 30 שניות), הם יוצרים את אותה סיסמה. עם זאת, כדי להתאים את הסחף השעון בין הצדדים וזמן התגובה האנושי, אתה יכול להגדיר את שירות TOTP לקבל גם TOTP מחלונות סמוכים.

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

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

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

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

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

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

רשום משתמשים ל-TOTP MFA

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

  1. ייבא את המחלקות והפונקציות הנדרשות של MFA:

    import {
      multiFactor,
      TotpMultiFactorGenerator,
      TotpSecret,
      getAuth,
    } from "firebase/auth";
    
  2. אימות מחדש של המשתמש.

  3. צור סוד TOTP עבור המשתמש המאומת:

    // Generate a TOTP secret.
    const multiFactorSession = await multiFactor(currentUser).getSession();
    const totpSecret = await TotpMultiFactorGenerator.generateSecret(
      multiFactorSession
    );
    
  4. הצג את הסוד למשתמש ובקש ממנו להזין אותו באפליקציית המאמת שלו.

    עם אפליקציות מאמת רבות, משתמשים יכולים להוסיף במהירות סודות TOTP חדשים על ידי סריקת קוד QR המייצג URI מפתח תואם Google Authenticator . כדי ליצור קוד QR למטרה זו, הפק את ה-URI עם generateQrCodeUrl() ולאחר מכן קודד אותו באמצעות ספריית קוד ה-QR לבחירתך. לדוגמה:

    const totpUri = totpSecret.generateQrCodeUrl(
        currentUser.email,
        "Your App's Name"
    );
    await QRExampleLib.toCanvas(totpUri, qrElement);
    

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

    // Also display this key:
    const secret = totpSecret.secretKey;
    

    לאחר שהמשתמש יוסיף את הסוד שלו לאפליקציית המאמת שלו, הוא יתחיל ליצור TOTPs.

  5. בקש מהמשתמש להקליד את ה-TOTP המוצג באפליקציית המאמת שלו ולהשתמש בו כדי לסיים את ההרשמה ל-MFA:

    // Ask the user for a verification code from the authenticator app.
    const verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    const multiFactorAssertion = TotpMultiFactorGenerator.assertionForEnrollment(
      totpSecret,
      verificationCode
    );
    await multiFactor(currentUser).enroll(multiFactorAssertion, mfaDisplayName);
    

היכנס למשתמשים עם גורם שני

כדי להיכנס למשתמשים עם TOTP MFA, השתמש בקוד הבא:

  1. ייבא את המחלקות והפונקציות הנדרשות של MFA:

    import {
        getAuth,
        getMultiFactorResolver,
        TotpMultiFactorGenerator,
    } from "firebase/auth";
    
  2. התקשר לאחת מהשיטות signInWith - כפי שהיית עושה אם לא היית משתמש ב-MFA. (לדוגמה, signInWithEmailAndPassword() .) אם השיטה זורקת auth/multi-factor-auth-required , התחל את זרימת ה-MFA של האפליקציה שלך.

    try {
        const userCredential = await signInWithEmailAndPassword(
            getAuth(),
            email,
            password
        );
        // If the user is not enrolled with a second factor and provided valid
        // credentials, sign-in succeeds.
    
        // (If your app requires MFA, this could be considered an error
        // condition, which you would resolve by forcing the user to enroll a
        // second factor.)
    
        // ...
    } catch (error) {
        switch (error.code) {
            case "auth/multi-factor-auth-required":
                // Initiate your second factor sign-in flow. (See next step.)
                // ...
                break;
            case ...:  // Handle other errors, such as wrong passwords.
                break;
        }
    }
    
  3. זרימת ה-MFA של האפליקציה שלך צריכה קודם כל לבקש מהמשתמש לבחור את הגורם השני שבו הוא רוצה להשתמש. אתה יכול לקבל רשימה של גורמים שניים נתמכים על ידי בחינת מאפיין hints של מופע MultiFactorResolver :

    const mfaResolver = getMultiFactorResolver(getAuth(), error);
    const enrolledFactors = mfaResolver.hints.map(info => info.displayName);
    
  4. אם המשתמש בוחר להשתמש ב-TOTP, בקש ממנו להקליד את ה-TOTP המוצג באפליקציית המאמת שלו ולהשתמש בו כדי להיכנס:

    switch (mfaResolver.hints[selectedIndex].factorId) {
        case TotpMultiFactorGenerator.FACTOR_ID:
            const otpFromAuthenticator = // OTP typed by the user.
            const multiFactorAssertion =
                TotpMultiFactorGenerator.assertionForSignIn(
                    mfaResolver.hints[selectedIndex].uid,
                    otpFromAuthenticator
                );
            try {
                const userCredential = await mfaResolver.resolveSignIn(
                    multiFactorAssertion
                );
                // Successfully signed in!
            } catch (error) {
                // Invalid or expired OTP.
            }
            break;
        case PhoneMultiFactorGenerator.FACTOR_ID:
            // Handle SMS second factor.
            break;
        default:
            // Unsupported second factor?
            break;
    }
    

בטל את ההרשמה מ-TOTP MFA

סעיף זה מתאר כיצד לטפל בביטול ההרשמה של משתמש מ-TOTP MFA.

אם משתמש נרשם למספר אפשרויות MFA, ואם הוא מבטל את ההרשמה מהאופציה שהופעלה לאחרונה, הוא מקבל auth/user-token-expired ומנותקים. המשתמש חייב להיכנס שוב ולאמת את האישורים הקיימים שלו - לדוגמה, כתובת דואר אלקטרוני וסיסמה.

כדי לבטל את רישום המשתמש, לטפל בשגיאה ולהפעיל אימות מחדש, השתמש בקוד הבא:

import {
    EmailAuthProvider,
    TotpMultiFactorGenerator,
    getAuth,
    multiFactor,
    reauthenticateWithCredential,
} from "firebase/auth";

try {
    // Unenroll from TOTP MFA.
    await multiFactor(currentUser).unenroll(mfaEnrollmentId);
} catch  (error) {
    if (error.code === 'auth/user-token-expired') {
        // If the user was signed out, re-authenticate them.

        // For example, if they signed in with a password, prompt them to
        // provide it again, then call `reauthenticateWithCredential()` as shown
        // below.

        const credential = EmailAuthProvider.credential(email, password);
        await reauthenticateWithCredential(
            currentUser,
            credential
        );
    }
}

מה הלאה