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. Bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulayıcı uygulama kullanmaları 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 Apple SDK'sını yükleyin.
TOTP MFA yalnızca Apple SDK sürümü v10.12.0 ve sonraki sürümlerde ve yalnızca iOS'te 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. 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.)
Sırrı kullanıcıya gösterin ve kimlik doğrulama uygulamasına girmesini isteyin:
// Display this key: let 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(withQRCodeURL:)
'ye iletin:let otpAuthUri = totpSecret.generateQRCodeURL( withAccountName: currentUser.email ?? "default account", issuer: "Your App Name") totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)
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. 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. }
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ü kimliklendirme kullanmıyormuş gibi
signIn(with...:)
yöntemlerinden birini çağırın (örneğin,signIn(withEmail:password:)
). Yöntem,secondFactorRequired
koduyla bir hata verirse uygulamanızın çok faktörlü kimliklendirme akışını başlatın.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 }
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:let mfaKey = AuthErrorUserInfoMultiFactorResolverKey guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return } let enrolledFactors = resolver.hints.map(\.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:
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 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:
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.
}
Sırada ne var?
- Admin SDK ile çok öğeli kullanıcıları programatik olarak yönetin.