Nếu đã nâng cấp lên Firebase Authentication with Identity Platform, bạn có thể thêm tính năng xác thực đa yếu tố (MFA) bằng mật khẩu dùng một lần theo thời gian (TOTP) vào ứng dụng của mình.
Firebase Authentication with Identity Platform cho phép bạn sử dụng TOTP làm yếu tố bổ sung cho MFA. Khi bạn bật tính năng này, người dùng cố gắng đăng nhập vào ứng dụng của bạn sẽ thấy yêu cầu về TOTP. Để tạo TOTP, họ phải sử dụng một ứng dụng xác thực có khả năng tạo mã TOTP hợp lệ, chẳng hạn như Google Authenticator.
Trước khi bắt đầu
Bật ít nhất một nhà cung cấp hỗ trợ MFA. Xin lưu ý rằng tất cả nhà cung cấp ngoại trừ những nhà cung cấp sau đây đều hỗ trợ MFA:
- Xác thực bằng điện thoại
- Xác thực ẩn danh
- Mã thông báo xác thực tuỳ chỉnh
- Apple Game Center
Đảm bảo ứng dụng của bạn xác minh địa chỉ email của người dùng. MFA yêu cầu xác minh email. Điều này giúp ngăn chặn các tác nhân độc hại đăng ký một dịch vụ bằng địa chỉ email mà họ không sở hữu, sau đó khoá quyền truy cập của chủ sở hữu thực sự của địa chỉ email bằng cách thêm yếu tố thứ hai.
Nếu bạn chưa làm như vậy, hãy cài đặt SDK Firebase cho Android.
MFA bằng TOTP chỉ được hỗ trợ trên SDK Android phiên bản v22.1.0 trở lên.
Bật MFA bằng TOTP
Để bật TOTP làm yếu tố thứ hai, hãy sử dụng Admin SDK hoặc gọi điểm cuối REST cấu hình dự án.
Để sử dụng Admin SDK, hãy làm như sau:
Nếu bạn chưa làm như vậy, hãy cài đặt SDK quản trị Firebase cho Node.js.
MFA bằng TOTP chỉ được hỗ trợ trên SDK quản trị Firebase cho Node.js phiên bản 11.6.0 trở lên.
Chạy lệnh sau:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })Thay thế các mục sau:
NUM_ADJ_INTERVALS: Số khoảng thời gian cửa sổ thời gian liền kề mà từ đó chấp nhận TOTP, từ 0 đến 10. Giá trị mặc định là 5.TOTP hoạt động bằng cách đảm bảo rằng khi hai bên (bên chứng minh và bên xác thực) tạo OTP trong cùng một khoảng thời gian (thường là 30 giây), họ sẽ tạo cùng một mật khẩu. Tuy nhiên, để điều chỉnh độ lệch đồng hồ giữa các bên và thời gian phản hồi của con người, bạn có thể định cấu hình dịch vụ TOTP để cũng chấp nhận TOTP từ các cửa sổ liền kề.
Để bật MFA bằng TOTP bằng API REST, hãy chạy lệnh sau:
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
}
}]
}
}'
Thay thế các mục sau:
PROJECT_ID: Mã dự án.NUM_ADJ_INTERVALS: Số khoảng thời gian cửa sổ thời gian, từ 0 đến 10. Giá trị mặc định là 5.TOTP hoạt động bằng cách đảm bảo rằng khi hai bên (bên chứng minh và bên xác thực) tạo OTP trong cùng một khoảng thời gian (thường là 30 giây), họ sẽ tạo cùng một mật khẩu. Tuy nhiên, để điều chỉnh độ lệch đồng hồ giữa các bên và thời gian phản hồi của con người, bạn có thể định cấu hình dịch vụ TOTP để cũng chấp nhận TOTP từ các cửa sổ liền kề.
Chọn một mẫu đăng ký
Bạn có thể chọn xem ứng dụng của mình có yêu cầu xác thực đa yếu tố hay không, cũng như cách thức và thời điểm đăng ký cho người dùng. Một số mẫu phổ biến bao gồm:
Đăng ký yếu tố thứ hai của người dùng trong quá trình đăng ký. Hãy sử dụng phương thức này nếu ứng dụng của bạn yêu cầu xác thực đa yếu tố cho tất cả người dùng.
Cung cấp một lựa chọn có thể bỏ qua để đăng ký yếu tố thứ hai trong quá trình đăng ký. Nếu bạn muốn khuyến khích nhưng không yêu cầu xác thực đa yếu tố trong ứng dụng của mình, bạn có thể sử dụng phương pháp này.
Cung cấp khả năng thêm yếu tố thứ hai từ trang quản lý tài khoản hoặc hồ sơ của người dùng, thay vì màn hình đăng ký. Điều này giúp giảm thiểu sự gián đoạn trong quá trình đăng ký, đồng thời vẫn cung cấp tính năng xác thực đa yếu tố cho những người dùng nhạy cảm về bảo mật.
Yêu cầu thêm yếu tố thứ hai theo từng bước khi người dùng muốn truy cập vào các tính năng có yêu cầu bảo mật cao hơn.
Đăng ký cho người dùng MFA bằng TOTP
Sau khi bạn bật MFA bằng TOTP làm yếu tố thứ hai cho ứng dụng của mình, hãy triển khai logic phía máy khách để đăng ký cho người dùng MFA bằng TOTP:
Xác thực lại người dùng.
Tạo một bí mật TOTP cho người dùng đã xác thực:
// 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.) } }Hiển thị bí mật cho người dùng và nhắc họ nhập bí mật đó vào ứng dụng xác thực:
// Display this key: val secret = totpSecret.sharedSecretKeyNgoài việc hiển thị khoá bí mật, bạn có thể thử tự động thêm khoá này vào ứng dụng xác thực mặc định của thiết bị. Để làm như vậy, hãy tạo một URI khoá tương thích với Google Authenticator, và truyền URI đó đến
openInOtpApp():val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)Sau khi người dùng thêm bí mật của họ vào ứng dụng xác thực, ứng dụng này sẽ bắt đầu tạo TOTP.
Nhắc người dùng nhập TOTP do ứng dụng xác thực của họ hiển thị và sử dụng TOTP đó để hoàn tất quá trình đăng ký 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. }
Đăng nhập cho người dùng bằng yếu tố thứ hai
Để đăng nhập cho người dùng bằng MFA bằng TOTP, hãy sử dụng mã sau:
Gọi một trong các phương thức
signInWithnhư khi bạn không sử dụng MFA. (Ví dụ:signInWithEmailAndPassword().) Nếu phương thức này gửi mộtFirebaseAuthMultiFactorException, hãy bắt đầu quy trình MFA của ứng dụng.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.) // ... } } }Quy trình MFA của ứng dụng trước tiên phải nhắc người dùng chọn yếu tố thứ hai mà họ muốn sử dụng. Bạn có thể xem danh sách các yếu tố thứ hai được hỗ trợ bằng cách kiểm tra thuộc tính
hintscủa một thực thểMultiFactorResolver:val enrolledFactors = exception.resolver.hints.map { it.displayName }Nếu người dùng chọn sử dụng TOTP, hãy nhắc họ nhập TOTP hiển thị trên ứng dụng xác thực và sử dụng TOTP đó để đăng nhập:
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. } }
Huỷ đăng ký MFA bằng TOTP
Phần này mô tả cách xử lý trường hợp người dùng huỷ đăng ký MFA bằng TOTP.
Nếu người dùng đã đăng ký nhiều lựa chọn MFA và nếu họ huỷ đăng ký lựa chọn được bật gần đây nhất, họ sẽ nhận được auth/user-token-expired và bị đăng xuất. Người dùng phải đăng nhập lại và xác minh thông tin đăng nhập hiện có, chẳng hạn như địa chỉ email và mật khẩu.
Để huỷ đăng ký cho người dùng, xử lý lỗi và kích hoạt quá trình xác thực lại, hãy sử dụng mã sau:
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.
}
}
}
}
Bước tiếp theo
- Quản lý người dùng đa yếu tố theo phương thức lập trình bằng Admin SDK.