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 JavaScript SDK'sını yükleyin.
TOTP MFA yalnızca v9.19.1 ve sonraki sürümlerdeki modüler Web SDK'sında 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:
Gerekli MFA sınıflarını ve işlevlerini içe aktarın:
import { multiFactor, TotpMultiFactorGenerator, TotpSecret, getAuth, } from "firebase/auth";
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. const multiFactorSession = await multiFactor(currentUser).getSession(); const totpSecret = await TotpMultiFactorGenerator.generateSecret( multiFactorSession );
Sırrı kullanıcıya gösterin ve kimlik doğrulama uygulamasına girmesini isteyin.
Birçok kimlik doğrulama uygulamasında kullanıcılar, Google Authenticator ile uyumlu bir anahtar URI'sini temsil eden bir QR kodunu tarayarak yeni TOTP sırlarını hızlıca ekleyebilir. Bu amaçla QR kodu oluşturmak için
generateQrCodeUrl()
ile URI oluşturun ve ardından seçtiğiniz QR kodu kitaplığını kullanarak kodlayın. Örneğin:const totpUri = totpSecret.generateQrCodeUrl( currentUser.email, "Your App's Name" ); await QRExampleLib.toCanvas(totpUri, qrElement);
QR kodu gösterip göstermediğinizden bağımsız olarak, QR kodu okuyamayan kimlik doğrulama uygulamalarını desteklemek için gizli anahtarı her zaman gösterin:
// Also display this key: const secret = totpSecret.secretKey;
Kullanıcı, gizli anahtarını kimlik doğrulama uygulamasına ekledikten sonra TOTP oluşturmaya başlar.
Kullanıcıdan kimlik doğrulama uygulamasında gösterilen TOTP'yi yazmasını isteyin ve çok faktörlü kimlik doğrulama kaydını tamamlamak için bu kodu kullanın:
// Ask the user for a verification code from the authenticator app. const verificationCode = // Code from user input. // Finalize the enrollment. const multiFactorAssertion = TotpMultiFactorGenerator.assertionForEnrollment( totpSecret, verificationCode ); await multiFactor(currentUser).enroll(multiFactorAssertion, mfaDisplayName);
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:
Gerekli MFA sınıflarını ve işlevlerini içe aktarın:
import { getAuth, getMultiFactorResolver, TotpMultiFactorGenerator, } from "firebase/auth";
Çok faktörlü kimlik doğrulama kullanmıyormuş gibi
signInWith
yöntemlerinden birini arayın. (Örneğin,signInWithEmailAndPassword()
.) Yöntem birauth/multi-factor-auth-required
hatası verirse uygulamanızın çok faktörlü kimlik doğrulama akışını başlatın.try { const userCredential = await signInWithEmailAndPassword( getAuth(), email, 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 (error) { switch (error.code) { case "auth/multi-factor-auth-required": // Initiate your second factor sign-in flow. (See next step.) // ... break; case ...: // Handle other errors, such as wrong passwords. break; } }
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:const mfaResolver = getMultiFactorResolver(getAuth(), error); const enrolledFactors = mfaResolver.hints.map(info => info.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:
switch (mfaResolver.hints[selectedIndex].factorId) { case TotpMultiFactorGenerator.FACTOR_ID: const otpFromAuthenticator = // OTP typed by the user. const multiFactorAssertion = TotpMultiFactorGenerator.assertionForSignIn( mfaResolver.hints[selectedIndex].uid, otpFromAuthenticator ); try { const userCredential = await mfaResolver.resolveSignIn( multiFactorAssertion ); // Successfully signed in! } catch (error) { // Invalid or expired OTP. } break; case PhoneMultiFactorGenerator.FACTOR_ID: // Handle SMS second factor. break; default: // Unsupported second factor? break; }
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:
import {
EmailAuthProvider,
TotpMultiFactorGenerator,
getAuth,
multiFactor,
reauthenticateWithCredential,
} from "firebase/auth";
try {
// Unenroll from TOTP MFA.
await multiFactor(currentUser).unenroll(mfaEnrollmentId);
} catch (error) {
if (error.code === 'auth/user-token-expired') {
// 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.
const credential = EmailAuthProvider.credential(email, password);
await reauthenticateWithCredential(
currentUser,
credential
);
}
}
Sırada ne var?
- Admin SDK ile çok öğeli kullanıcıları programatik olarak yönetin.