اگر به Firebase Authentication with Identity Platform ارتقا دادهاید، میتوانید اصالتسنجی چندعاملی (MFA) گذرواژه یکباره زمانمبنا (TOTP) را به برنامهتان اضافه کنید.
Firebase Authentication with Identity Platform به شما امکان میدهد از گذرواژه یکبارمصرف زمانمبنا بهعنوان عامل اضافی برای اصالتسنجی چندعاملی استفاده کنید. وقتی این ویژگی را فعال میکنید، کاربرانی که میخواهند به سیستم برنامهتان وارد شوند، درخواستی برای TOTP میبینند. برای تولید آن، باید از برنامه اصالتسنجیای استفاده کنند که بتواند کدهای TOTP معتبر تولید کند، مثل Google Authenticator.
قبل از شروع
حداقل یک ارائهدهنده را که از MFA پشتیبانی میکند فعال کنید. توجه داشته باشید که همه ارائهدهندگان بهجز موارد زیر از «احراز هویت چندعاملی» پشتیبانی میکنند:
- احراز هویت تلفن
- احراز هویت ناشناس
- کدهای اصالتسنجی سفارشی
- Apple Game Center
مطمئن شوید برنامهتان نشانی ایمیل کاربران را درستیسنجی میکند. احراز هویت چندعاملی به درستیسنجی ایمیل نیاز دارد. این کار از ثبتنام عاملان بدخواه در سرویس با نشانی ایمیلی که متعلق به آنها نیست و سپس قفل کردن دسترسی مالک واقعی نشانی ایمیل با افزودن عامل دوم جلوگیری میکند.
اگر قبلاً این کار را نکردهاید، Firebase Apple SDK را نصب کنید.
«احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا» فقط در کیت توسعه نرمافزار Apple نسخه v10.12.0 و بالاتر، و فقط در iOS پشتیبانی میشود.
فعال کردن «احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا»
برای فعال کردن TOTP بهعنوان عامل دوم، از Admin SDK استفاده کنید یا با نقطه پایانی REST پیکربندی پروژه تماس بگیرید.
برای استفاده از Admin SDK، کارهای زیر را انجام دهید:
اگر قبلاً این کار را نکردهاید، کیت توسعه نرمافزار Firebase Admin Node.js را نصب کنید.
TOTP MFA فقط در «کیت توسعه نرمافزار Firebase Admin Node.js» نسخه ۱۱.۶.۰ و بالاتر پشتیبانی میشود.
موارد زیر را اجرا کنید:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })موارد زیر را جایگزین کنید:
NUM_ADJ_INTERVALS: تعداد بازههای زمانی مجاور که «گذرواژههای یکباره زمانمبنا» از آنها پذیرفته میشود، از صفر تا ده. پیشفرض پنج است.نحوه عملکرد گذرواژه یکبارمصرف زمانمبنا به این صورت است که وقتی دو طرف (اثباتکننده و اعتبارسنج) گذرواژه یکبارمصرف را در یک پنجره زمانی یکسان (معمولاً ۳۰ ثانیه) تولید میکنند، گذرواژه یکسانی تولید میشود. بااینحال، برای تطبیق دادن انحراف ساعت بین طرفین و زمان پاسخ انسان، میتوانید سرویس TOTP را پیکربندی کنید تا TOTP را از پنجرههای مجاور نیز بپذیرد.
برای فعال کردن «احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا» بااستفاده از 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 را پیکربندی کنید تا TOTP را از پنجرههای مجاور نیز بپذیرد.
انتخاب الگوی ثبتنام
میتوانید انتخاب کنید که آیا برنامهتان به اصالتسنجی چندعاملی نیاز دارد یا نه، و چگونه و چه زمانی کاربران را ثبتنام کنید. برخیاز الگوهای رایج عبارتاند از:
عامل دوم کاربر را بهعنوان بخشی از ثبتنام ثبت کنید. اگر برنامهتان برای همه کاربران به اصالتسنجی چندعاملی نیاز دارد، از این روش استفاده کنید.
گزینهای قابلردشدن برای ثبت عامل دوم درطول ثبتنام ارائه دهید. اگر میخواهید اصالتسنجی چندعاملی را در برنامهتان تشویق کنید اما آن را الزامی نکنید، میتوانید از این رویکرد استفاده کنید.
امکان افزودن عامل دوم از صفحه مدیریت حساب یا نمایه کاربر، بهجای صفحه ثبتنام، فراهم شود. این کار اصطکاک را درطول فرایند ثبتنام بهحداقل میرساند و درعینحال اصالتسنجی چندعاملی را برای کاربران حساس به امنیت دردسترس قرار میدهد.
وقتی کاربر میخواهد به ویژگیهایی با الزامات امنیتی بیشتر دسترسی پیدا کند، افزودن عامل دوم بهصورت افزایشی الزامی است.
ثبتنام کاربران در «احراز هویت چندعاملی گذرواژه یکباره زمانمبنا»
پساز فعال کردن «احراز هویت چندعاملی گذرواژه یکباره زمانمبنا» بهعنوان عامل دوم برای برنامهتان، منطق سمت کارخواه را برای ثبتنام کاربران در «احراز هویت چندعاملی گذرواژه یکباره زمانمبنا» پیادهسازی کنید:
اصالتسنجی مجدد کاربر.
تولید کردن کلید 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.)رمز را به کاربر نشان دهید و از او بخواهید آن را در برنامه اصالتسنجی خود وارد کند:
// Display this key: let secret = totpSecret.sharedSecretKey()علاوهبر نمایش کلید امن، میتوانید آن را بهطور خودکار به برنامه اصالتسنجی پیشفرض دستگاه اضافه کنید. برای انجام این کار، یک شناسه منبع یکسان سازگار با Google Authenticator تولید کنید و آن را به
openInOTPApp(withQRCodeURL:)ارسال کنید:let otpAuthUri = totpSecret.generateQRCodeURL( withAccountName: currentUser.email ?? "default account", issuer: "Your App Name") totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)پساز اینکه کاربر کلید خصوصی خود را به برنامه اصالتسنجی اضافه کرد، برنامه شروع به تولید گذرواژههای یکباره زمانمبنا میکند.
از کاربر بخواهید «گذرواژه یکباره زمانمبنا» (TOTP) نمایشدادهشده در برنامه اصالتسنجی را تایپ کند و از آن برای نهایی کردن ثبتنام در «احراز هویت چندعاملی» استفاده کند:
// 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. }
ورود کاربران به سیستم با عامل دوم
برای وارد کردن کاربران به سیستم بااستفاده از «احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا»، از کد زیر استفاده کنید:
یکی از روشهای
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 }جریان MFA برنامه شما باید ابتدا از کاربر بخواهد عامل دوم موردنظرش را برای استفاده انتخاب کند. میتوانید با بررسی ویژگی
hintsاز نمونهMultiFactorResolver، فهرستی از عوامل دوم پشتیبانیشده را دریافت کنید:let mfaKey = AuthErrorUserInfoMultiFactorResolverKey guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return } let enrolledFactors = resolver.hints.map(\.displayName)اگر کاربر انتخاب کند که از 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 }
لغو ثبتنام از «احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا»
این بخش نحوه رسیدگی به لغو ثبتنام کاربر از «احراز هویت چندعاملی گذرواژه یکبارمصرف زمانمبنا» را شرح میدهد.
اگر کاربری برای چند گزینه «احراز هویت چندعاملی» ثبتنام کرده باشد و از جدیدترین گزینه فعالشده لغو ثبتنام کند، 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.
}
حالا چه میشود
- مدیریت کاربران چندعاملی بهصورت برنامهنویسیشده با Admin SDK.