احراز هویت چند عاملی TOTP را به برنامه iOS خود اضافه کنید

اگر به Firebase Authentication with Identity Platform ارتقا داده اید، می توانید احراز هویت چند مرحله ای رمز عبور یکبار مصرف (TOTP) مبتنی بر زمان (MFA) را به برنامه خود اضافه کنید.

Firebase Authentication with Identity Platform به شما امکان می دهد از TOTP به عنوان یک عامل اضافی برای MFA استفاده کنید. وقتی این ویژگی را فعال می‌کنید، کاربرانی که تلاش می‌کنند به برنامه شما وارد شوند، درخواست TOTP را مشاهده می‌کنند. برای تولید آن، آنها باید از یک برنامه احراز هویت که قادر به تولید کدهای معتبر TOTP باشد، مانند Google Authenticator استفاده کنند.

قبل از شروع

  1. حداقل یک ارائه دهنده را فعال کنید که از MFA پشتیبانی می کند. توجه داشته باشید که همه ارائه دهندگان به جز MFA زیر پشتیبانی می کنند:

    • احراز هویت تلفن
    • ناشناس auth
    • توکن‌های احراز هویت سفارشی
    • مرکز بازی اپل
  2. اطمینان حاصل کنید که برنامه شما آدرس های ایمیل کاربر را تأیید می کند. وزارت امور خارجه به تأیید ایمیل نیاز دارد. این امر مانع از ثبت نام عوامل مخرب در سرویسی با آدرس ایمیلی می شود که متعلق به آنها نیست و سپس با افزودن عامل دوم، مالک واقعی آدرس ایمیل را قفل می کند.

  3. اگر قبلاً این کار را نکرده‌اید، Firebase Apple SDK را نصب کنید.

    TOTP MFA فقط در نسخه Apple SDK نسخه 10.12.0 و بالاتر و فقط در iOS پشتیبانی می شود.

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 : تعداد فواصل پنجره زمانی مجاور که از آن ها TOTP ها را می پذیرند، از صفر تا ده. پیش فرض پنج است.

      TOTP ها با اطمینان از اینکه وقتی دو طرف (اثبات کننده و تایید کننده) OTP را در یک پنجره زمانی (معمولاً 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 : تعداد فواصل پنجره زمانی، از صفر تا ده. پیش فرض پنج است.

    TOTP ها با اطمینان از اینکه وقتی دو طرف (اثبات کننده و تایید کننده) OTP را در یک پنجره زمانی (معمولاً 30 ثانیه) تولید می کنند، رمز عبور یکسانی تولید می کنند، کار می کنند. با این حال، برای تطبیق تغییر ساعت بین طرفین و زمان پاسخ انسان، می‌توانید سرویس TOTP را طوری پیکربندی کنید که TOTPها را از پنجره‌های مجاور نیز بپذیرد.

الگوی ثبت نام را انتخاب کنید

می‌توانید انتخاب کنید که آیا برنامه شما به احراز هویت چند مرحله‌ای نیاز دارد یا خیر، و چگونه و چه زمانی کاربران خود را ثبت‌نام کند. برخی از الگوهای رایج عبارتند از:

  • فاکتور دوم کاربر را به عنوان بخشی از ثبت نام ثبت کنید. اگر برنامه شما نیاز به احراز هویت چند عاملی برای همه کاربران دارد، از این روش استفاده کنید.

  • برای ثبت فاکتور دوم در حین ثبت نام، یک گزینه قابل پرش ارائه دهید. اگر می خواهید تشویق کنید اما نیازی به احراز هویت چند عاملی در برنامه خود ندارید، ممکن است از این روش استفاده کنید.

  • به جای صفحه ثبت نام، امکان اضافه کردن فاکتور دوم را از صفحه مدیریت حساب کاربری یا نمایه کاربر فراهم کنید. این امر اصطکاک را در طول فرآیند ثبت نام به حداقل می رساند، در حالی که هنوز احراز هویت چند عاملی را برای کاربران حساس به امنیت در دسترس قرار می دهد.

  • هنگامی که کاربر می‌خواهد به ویژگی‌هایی با الزامات امنیتی افزایش یافته دسترسی پیدا کند، باید فاکتور دوم را به صورت تدریجی اضافه کنید.

ثبت نام کاربران در TOTP MFA

پس از اینکه TOTP MFA را به عنوان عامل دوم برای برنامه خود فعال کردید، منطق سمت مشتری را برای ثبت نام کاربران در TOTP MFA پیاده سازی کنید:

  1. احراز هویت مجدد کاربر

  2. یک راز TOTP برای کاربر احراز هویت شده ایجاد کنید:

    // Generate a TOTP secret.
    guard let mfaSession = try? await currentUser.multiFactor.session() else { return }
    guard let totpSecret = try? await TOTPMultiFactorGenerator.generateSecret(with: mfaSession) else { return }
    
    // Display the secret to the user and prompt them to enter it into their
    // authenticator app. (See the next step.)
    
  3. راز را به کاربر نمایش دهید و از او بخواهید آن را در برنامه احراز هویت خود وارد کند:

    // Display this key:
    let secret = totpSecret.sharedSecretKey()
    

    علاوه بر نمایش کلید مخفی، می توانید سعی کنید به طور خودکار آن را به برنامه احراز هویت پیش فرض دستگاه اضافه کنید. برای انجام این کار، یک URI کلید سازگار با Google Authenticator ایجاد کنید و آن را به openInOTPApp(withQRCodeURL:) ارسال کنید:

    let otpAuthUri = totpSecret.generateQRCodeURL(
        withAccountName: currentUser.email ?? "default account",
        issuer: "Your App Name")
    totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)
    

    پس از اینکه کاربر راز خود را به برنامه احراز هویت خود اضافه کرد، شروع به تولید TOTP می کند.

  4. از کاربر بخواهید تا TOTP نمایش داده شده توسط برنامه احراز هویت خود را تایپ کند و از آن برای نهایی کردن ثبت نام MFA استفاده کند:

    // Ask the user for a verification code from the authenticator app.
    let verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    let multiFactorAssertion = TOTPMultiFactorGenerator.assertionForEnrollment(
        with: totpSecret,
        oneTimePassword: verificationCode)
    do {
        try await currentUser.multiFactor.enroll(
            with: multiFactorAssertion,
            displayName: "TOTP")
    } catch {
        // Wrong or expired OTP. Re-prompt the user.
    }
    

ورود کاربران با فاکتور دوم

برای ورود کاربران با TOTP MFA از کد زیر استفاده کنید:

  1. یکی از روش‌های signIn(with...:) - را همانطور که اگر از MFA استفاده نمی‌کردید، فراخوانی کنید (مثلا signIn(withEmail:password:) ). اگر روش با کد secondFactorRequired خطایی ایجاد کرد، جریان MFA برنامه خود را شروع کنید.

    do {
        let authResult = try await Auth.auth().signIn(withEmail: email, password: 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 let error as AuthErrorCode where error.code == .secondFactorRequired {
        // Initiate your second factor sign-in flow. (See next step.)
        // ...
    } catch {
        // Other auth error.
        throw error
    }
    
  2. جریان MFA برنامه شما ابتدا باید از کاربر بخواهد عامل دومی را که می‌خواهد استفاده کند انتخاب کند. با بررسی ویژگی hints یک نمونه MultiFactorResolver می‌توانید فهرستی از فاکتورهای دوم پشتیبانی شده را دریافت کنید:

    let mfaKey = AuthErrorUserInfoMultiFactorResolverKey
    guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return }
    let enrolledFactors = resolver.hints.map(\.displayName)
    
  3. اگر کاربر استفاده از TOTP را انتخاب کرد، از او بخواهید تا TOTP نمایش داده شده در برنامه احراز هویت خود را تایپ کند و از آن برای ورود به سیستم استفاده کند:

    let multiFactorInfo = resolver.hints[selectedIndex]
    switch multiFactorInfo.factorID {
    case TOTPMultiFactorID:
        let otpFromAuthenticator = // OTP typed by the user.
        let assertion = TOTPMultiFactorGenerator.assertionForSignIn(
            withEnrollmentID: multiFactorInfo.uid,
            oneTimePassword: otpFromAuthenticator)
        do {
            let authResult = try await resolver.resolveSignIn(with: assertion)
        } catch {
            // Wrong or expired OTP. Re-prompt the user.
        }
    default:
        return
    }
    

لغو ثبت نام از TOTP MFA

این بخش نحوه رسیدگی به یک کاربر در حال لغو ثبت نام از TOTP MFA را شرح می دهد.

اگر کاربر برای چندین گزینه MFA ثبت نام کرده باشد، و اگر از آخرین گزینه فعال شده خارج شود، یک auth/user-token-expired دریافت می کند و از سیستم خارج می شود. کاربر باید دوباره وارد سیستم شود و اعتبار موجود خود را تأیید کند - به عنوان مثال، آدرس ایمیل و رمز عبور.

برای لغو ثبت نام کاربر، رسیدگی به خطا و شروع احراز هویت مجدد، از کد زیر استفاده کنید:

guard let currentUser = Auth.auth().currentUser else { return }

// Prompt the user to select a factor to unenroll, from this array:
currentUser.multiFactor.enrolledFactors

// ...

// Unenroll the second factor.
let multiFactorInfo = currentUser.multiFactor.enrolledFactors[selectedIndex]
do {
    try await currentUser.multiFactor.unenroll(with: multiFactorInfo)
} catch let error as AuthErrorCode where error.code == .invalidUserToken {
    // Second factor unenrolled, but the user was signed out. Re-authenticate
    // them.
}

بعدش چی