اگر به Firebase Authentication with Identity Platform ارتقا داده اید، می توانید احراز هویت چند مرحله ای رمز عبور یکبار مصرف (TOTP) مبتنی بر زمان (MFA) را به برنامه خود اضافه کنید.
Firebase Authentication with Identity Platform به شما امکان می دهد از TOTP به عنوان یک عامل اضافی برای MFA استفاده کنید. وقتی این ویژگی را فعال میکنید، کاربرانی که تلاش میکنند به برنامه شما وارد شوند، درخواست TOTP را مشاهده میکنند. برای تولید آن ، آنها باید از یک برنامه تأیید کننده قادر به تولید کدهای معتبر TOTP مانند Google Authenticator استفاده کنند.
قبل از شروع
حداقل یک ارائه دهنده را فعال کنید که از MFA پشتیبانی می کند. توجه داشته باشید که همه ارائه دهندگان به جز MFA پشتیبانی زیر:
- احراز هویت تلفن
- ناشناس اعتبار
- توکنهای احراز هویت سفارشی
- مرکز بازی اپل
اطمینان حاصل کنید که برنامه شما آدرس های ایمیل کاربر را تأیید می کند. وزارت امور خارجه به تأیید ایمیل نیاز دارد. این امر مانع از ثبت نام عوامل مخرب در سرویسی با آدرس ایمیلی می شود که متعلق به آنها نیست و سپس با افزودن عامل دوم، مالک واقعی آدرس ایمیل را قفل می کند.
اگر قبلاً این کار را نکرده اید ، Android SDK Firebase را نصب کنید.
TOTP MFA فقط در نسخه Android SDK v22.1.0 و بالاتر پشتیبانی می شود.
TOTP MFA را فعال کنید
برای فعال کردن TOTP به عنوان عامل دوم ، از Admin SDK استفاده کنید یا با نقطه انتهایی تنظیمات پیکربندی پروژه تماس بگیرید.
برای استفاده از Admin SDK موارد زیر را انجام دهید:
اگر قبلاً این کار را نکرده اید ، Node.js SDK Node.js SDK Firebase را نصب کنید.
TOTP MFA فقط در Firebase Admin Node.js SDK نسخه های 11.6.0 و بالاتر پشتیبانی می شود.
موارد زیر را اجرا کنید:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })
موارد زیر را جایگزین کنید:
NUM_ADJ_INTERVALS
: تعداد فواصل بازه زمانی پنجره مجاور که از آن می توان TOTPS را پذیرفت ، از صفر تا ده. پیش فرض پنج است.TOTP ها با اطمینان از اینکه وقتی دو طرف (اثبات کننده و تایید کننده) OTP را در یک پنجره زمانی (معمولاً 30 ثانیه) تولید می کنند، رمز عبور یکسانی تولید می کنند، کار می کنند. با این حال، برای تطبیق تغییر ساعت بین طرفین و زمان پاسخ انسان، میتوانید سرویس TOTP را طوری پیکربندی کنید که TOTPها را از پنجرههای مجاور نیز بپذیرد.
برای فعال کردن TOTP MFA با استفاده از API REST ، موارد زیر را اجرا کنید:
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 پیاده سازی کنید:
احراز هویت مجدد کاربر
یک راز TOTP را برای کاربر معتبر ایجاد کنید:
// Generate a TOTP secret. Firebase.auth.currentUser.multiFactor.session .addOnSuccessListener { multiFactorSession -> TotpMultiFactorGenerator.generateSecret(multiFactorSession) .addOnSuccessListener { totpSecret -> // Display the secret to the user and prompt them to // enter it into their authenticator app. (See the next // step.) } }
راز را به کاربر نمایش دهید و از او بخواهید آن را در برنامه احراز هویت خود وارد کند:
// Display this key: val secret = totpSecret.sharedSecretKey
علاوه بر نمایش کلید مخفی، می توانید سعی کنید به طور خودکار آن را به برنامه احراز هویت پیش فرض دستگاه اضافه کنید. برای انجام این کار، یک URI کلید سازگار با Google Authenticator ایجاد کنید و آن را به
openInOtpApp()
ارسال کنید:val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)
پس از اینکه کاربر راز خود را به برنامه احراز هویت خود اضافه کرد، شروع به تولید TOTP می کند.
از کاربر بخواهید تا TOTP نمایش داده شده توسط برنامه احراز هویت خود را تایپ کند و از آن برای نهایی کردن ثبت نام MFA استفاده کند:
// Ask the user for a verification code from the authenticator app. val verificationCode = // Code from user input. // Finalize the enrollment. val multiFactorAssertion = TotpMultiFactorGenerator .getAssertionForEnrollment(totpSecret, verificationCode) Firebase.auth.currentUser.multiFactor.enroll(multiFactorAssertion, "TOTP") .addOnSuccessListener { // Enrollment complete. }
ورود کاربران با فاکتور دوم
برای ورود کاربران با TOTP MFA از کد زیر استفاده کنید:
اگر از MFA استفاده نمی کردید ، با یکی از
signInWith
- روش هایی تماس بگیرید. (به عنوان مثال،signInWithEmailAndPassword()
.) اگر متدFirebaseAuthMultiFactorException
را ایجاد می کند، جریان MFA برنامه خود را شروع کنید.Firebase.auth.signInWithEmailAndPassword(email, password) .addOnSuccessListener { result -> // 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.) // ... } .addOnFailureListener { exception -> when (exception) { is FirebaseAuthMultiFactorException -> { // Initiate your second factor sign-in flow. (See next step.) // ... } } }
جریان MFA برنامه شما ابتدا باید از کاربر بخواهد عامل دومی را که میخواهد استفاده کند انتخاب کند. با بررسی ویژگی
hints
یک نمونهMultiFactorResolver
میتوانید فهرستی از فاکتورهای دوم پشتیبانی شده را دریافت کنید:val enrolledFactors = exception.resolver.hints.map { it.displayName }
If the user chooses to use TOTP, prompt them to type the TOTP displayed on their authenticator app and use it to sign in:
when (exception.resolver.hints[selectedIndex].factorId) { TotpMultiFactorGenerator.FACTOR_ID -> { val otpFromAuthenticator = // OTP typed by the user. val assertion = TotpMultiFactorGenerator.getAssertionForSignIn( exception.resolver.hints[selectedIndex].uid, otpFromAuthenticator ) exception.resolver.resolveSignIn(assertion) .addOnSuccessListener { result -> // Successfully signed in! } .addOnFailureListener { resolveError -> // Invalid or expired OTP. } } PhoneMultiFactorGenerator.FACTOR_ID -> { // Handle SMS second factor. } }
لغو ثبت نام از TOTP MFA
این بخش نحوه رسیدگی به یک کاربر در حال لغو ثبت نام از TOTP MFA را شرح می دهد.
اگر کاربر برای چندین گزینه MFA ثبت نام کرده باشد، و اگر از آخرین گزینه فعال شده خارج شود، یک auth/user-token-expired
دریافت می کند و از سیستم خارج می شود. The user must sign in again and verify their existing credentials—for example, an email address and password.
To unenroll the user, handle the error, and trigger reauthentication, use the following code:
Firebase.auth.currentUser.multiFactor.unenroll(mfaEnrollmentId)
.addOnSuccessListener {
// Second factor unenrolled.
}
.addOnFailureListener { exception ->
when (exception) {
is FirebaseAuthInvalidUserException -> {
// Second factor unenrolled. 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.
val credential = EmailAuthProvider.getCredential(email, password)
currentUser.reauthenticate(credential)
.addOnSuccessListener {
// Success!
}
.addOnFailureListener {
// Bad email address and password combination.
}
}
}
}
بعدش چی
- با Admin SDK کاربران چند عاملی را به صورت برنامهنویسی مدیریت کنید .