Firebase Authentication with Identity Platform sürümüne yükselttiyseniz uygulamanıza zamana dayalı tek kullanımlık şifre (TOTP) çok öğeli kimlik doğrulaması (MFA) ekleyebilirsiniz.
Firebase Authentication with Identity Platform, TOTP'yi MFA için ek bir öğe olarak kullanmanıza olanak tanır. Bu özelliği etkinleştirdiğinizde uygulamanızda oturum açmaya çalışan kullanıcılara TOTP isteği gösterilir. Kullanıcıların bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulayıcı uygulaması kullanması gerekir.
Başlamadan önce
Çok faktörlü kimlik doğrulamayı destekleyen en az bir sağlayıcıyı etkinleştirin. Aşağıdakiler hariç tüm sağlayıcıların çok faktörlü kimlik doğrulamayı desteklediğini unutmayın:
- Telefonla kimlik doğrulama
- Anonim kimlik doğrulama
- Özel kimlik doğrulama jetonları
- Apple Game Center
Uygulamanızın kullanıcı e-posta adreslerini doğruladığından emin olun. ÇFDO için e-posta doğrulaması gerekir. Bu sayede kötü niyetli kişiler, kendilerine ait olmayan bir e-posta adresiyle hizmete kaydolup ikinci bir faktör ekleyerek e-posta adresinin asıl sahibinin hesabına erişmesini engelleyemez.
Henüz yapmadıysanız Firebase Android SDK'sını yükleyin.
TOTP MFA yalnızca Android SDK sürümü v22.1.0 ve sonraki sürümlerde desteklenir.
TOTP MFA'yı etkinleştirme
TOTP'yi ikinci faktör olarak etkinleştirmek için Admin SDK simgesini kullanın veya proje yapılandırması REST uç noktasını çağırın.
Admin SDK özelliğini kullanmak için aşağıdakileri yapın:
Henüz yapmadıysanız Firebase Admin Node.js SDK'sını yükleyin.
TOTP MFA yalnızca Firebase Admin Node.js SDK'sının 11.6.0 ve sonraki sürümlerinde desteklenir.
Aşağıdaki komutu çalıştırın:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })
Aşağıdakini değiştirin:
NUM_ADJ_INTERVALS
: TOTP'lerin kabul edileceği bitişik zaman aralığı sayısı (sıfır ila on). Varsayılan değer beştir.TOTP'ler, iki taraf (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerdeki TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.
REST API'yi kullanarak TOTP MFA'yı etkinleştirmek için aşağıdakileri çalıştırın:
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
}
}]
}
}'
Aşağıdakini değiştirin:
PROJECT_ID
: Proje kimliği.NUM_ADJ_INTERVALS
: Sıfırdan ona kadar olan zaman aralığı sayısı. Varsayılan değer beştir.TOTP'ler, iki taraf (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerdeki TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.
Kayıt modeli seçme
Uygulamanızın çok öğeli kimlik doğrulaması gerektirip gerektirmediğini ve kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Sık karşılaşılan bazı kalıplar şunlardır:
Kullanıcının ikinci faktörünü kayıt sırasında kaydedin. Uygulamanız tüm kullanıcılar için çok öğeli kimlik doğrulaması gerektiriyorsa bu yöntemi kullanın.
Kayıt sırasında ikinci bir faktör kaydetmek için atlanabilir bir seçenek sunun. Uygulamanızda çok öğeli kimlik doğrulamayı zorunlu kılmak yerine teşvik etmek istiyorsanız bu yaklaşımı kullanabilirsiniz.
Kayıt ekranı yerine kullanıcının hesap veya profil yönetimi sayfasından ikinci bir faktör ekleme olanağı sunun. Bu sayede, kayıt sürecinde sorun yaşama ihtimali en aza indirilirken güvenliğe duyarlı kullanıcılar için çok öğeli kimlik doğrulama özelliği kullanılmaya devam edebilir.
Kullanıcı, daha fazla güvenlik gerektiren özelliklere erişmek istediğinde ikinci faktörün kademeli olarak eklenmesini zorunlu kılın.
Kullanıcıları TOTP MFA'ya kaydetme
Uygulamanız için ikinci faktör olarak TOTP MFA'yı etkinleştirdikten sonra, kullanıcıları TOTP MFA'ya kaydetmek için istemci tarafı mantığını uygulayın:
Kullanıcının kimliğini yeniden doğrulayın.
Kimliği doğrulanmış kullanıcı için TOTP gizli anahtarı oluşturun:
// 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.) } }
Sırrı kullanıcıya gösterin ve kimlik doğrulama uygulamasına girmesini isteyin:
// Display this key: val secret = totpSecret.sharedSecretKey
Gizli anahtarı göstermenin yanı sıra, anahtarı cihazın varsayılan kimlik doğrulama uygulamasına otomatik olarak eklemeyi de deneyebilirsiniz. Bunu yapmak için Google Authenticator ile uyumlu bir anahtar URI'si oluşturun ve
openInOtpApp()
'ye iletin:val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)
Kullanıcı, gizli anahtarını kimlik doğrulama uygulamasına ekledikten sonra TOTP oluşturmaya başlar.
Kullanıcıdan, Authenticator uygulaması tarafından gösterilen TOTP'yi yazmasını ve MFA kaydını tamamlamak için kullanmasını isteyin:
// 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. }
Kullanıcıların ikinci bir etmenle oturum açmasını sağlama
Kullanıcıların TOTP MFA ile oturum açmasını sağlamak için aşağıdaki kodu kullanın:
Çok faktörlü kimlik doğrulama kullanmıyormuş gibi
signInWith
yöntemlerinden birini arayın. (Örneğin,signInWithEmailAndPassword()
.) Yöntem birFirebaseAuthMultiFactorException
oluşturursa uygulamanızın çok faktörlü kimlik doğrulama akışını başlatın.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.) // ... } } }
Uygulamanızın MFA akışı, kullanıcıdan önce kullanmak istediği ikinci faktörü seçmesini istemelidir. Desteklenen ikinci faktörlerin listesini, bir
MultiFactorResolver
örneğininhints
özelliğini inceleyerek edinebilirsiniz:val enrolledFactors = exception.resolver.hints.map { it.displayName }
Kullanıcı TOTP'yi kullanmayı seçerse kimlik doğrulama uygulamasında gösterilen TOTP'yi yazmasını ve oturum açmak için kullanmasını isteyin:
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 kaydını iptal etme
Bu bölümde, kullanıcının TOTP MFA'dan kaydını silme işleminin nasıl ele alınacağı açıklanmaktadır.
Bir kullanıcı birden fazla MFA seçeneğine kaydolduysa ve en son etkinleştirilen seçeneğin kaydını silerse auth/user-token-expired
alır ve oturumu kapatılır. Kullanıcının tekrar oturum açması ve mevcut kimlik bilgilerini (ör. e-posta adresi ve şifre) doğrulaması gerekir.
Kullanıcının kaydını silmek, hatayı işlemek ve yeniden kimlik doğrulamayı tetiklemek için aşağıdaki kodu kullanın:
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.
}
}
}
}
Sırada ne var?
- Admin SDK ile çok öğeli kullanıcıları programatik olarak yönetin.