Firebase Authentication with Identity Platform sürümüne yükseldiyseniz uygulamanıza zamana dayalı tek kullanımlık şifre (TOTP) çok faktörlü kimlik doğrulaması (MFA) ekleyebilirsiniz.
Firebase Authentication with Identity Platform, MFA için ek faktör olarak TOTP kullanmanıza olanak tanır. Bu özelliği etkinleştirdiğinizde, uygulamanızda oturum açmaya çalışan kullanıcılar TOTP isteği görür. Bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulama uygulaması kullanmalıdır.
Başlamadan önce
MFA'yı destekleyen en az bir sağlayıcıyı etkinleştirin. Aşağıdakiler haricindeki tüm sağlayıcıların MFA'yı desteklediğini unutmayın:
- Telefonla kimlik doğrulama
- Anonim kimlik doğrulama
- Özel yetkilendirme jetonları
- Apple Oyun Merkezi
Uygulamanızın kullanıcı e-posta adreslerini doğruladığından emin olun. Çok faktörlü kimlik doğrulama için e-posta doğrulaması gerekir. Bu sayede kötü niyetli kişiler, kendilerine ait olmayan bir e-posta adresiyle bir hizmete kaydolamaz ve ikinci bir faktör ekleyerek e-posta adresinin gerçek sahibini kilitleyemez.
Henüz yapmadıysanız Firebase JavaScript SDK'sını yükleyin.
TOTP MFA yalnızca modüler Web SDK'sında (v9.19.1 ve sonraki sürümler) desteklenir.
TOTP MFA'yı etkinleştirme
TOTP'yi ikinci faktör olarak etkinleştirmek için Admin SDK kullanın veya proje yapılandırması REST uç noktasını çağırın.
Admin SDK uygulamasını 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ığı aralıkları sayısı (sıfır ile on arasında). Varsayılan değer beş'tir.TOTP'ler, iki tarafın (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlar. Bununla birlikte, taraflar arasındaki saat kaymasını ve gerçek kişilerin yanıt sürelerini dikkate almak için TOTP hizmetini bitişik pencerelerden gelen 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ır ile on arasında değişen zaman aralığı sayısı. Varsayılan değer beştir.TOTP'ler, iki tarafın (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlar. Ancak taraflar arasındaki saat farkı ve kullanıcı yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerden gelen TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.
Kayıt modeli seçme
Uygulamanızda çok faktörlü kimlik doğrulamasının gerekli olup olmadığını, kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Yaygın olarak karşılaşılan bazı kalıplar şunlardır:
Kullanıcının ikinci faktörünü kayıt işleminin bir parçası olarak kaydedin. Uygulamanız tüm kullanıcılar için çok faktörlü kimlik doğrulaması gerektiriyorsa bu yöntemi kullanın.
Kayıt sırasında ikinci bir faktör kaydetme seçeneği sunun. Uygulamanızda çok öğeli kimlik doğrulamasını teşvik etmek ancak zorunlu tutmak istemiyorsanız bu yaklaşımı kullanabilirsiniz.
Kaydolma ekranı yerine kullanıcının hesabı veya profil yönetimi sayfasından ikinci bir faktör ekleme olanağı sunun. Bu sayede, kayıt işlemi sırasındaki zorlukları en aza indirirken güvenlik konusunda hassas kullanıcılar için çok faktörlü kimlik doğrulamayı kullanmaya devam edebilirsiniz.
Kullanıcı, daha yüksek güvenlik şartlarına sahip özelliklere erişmek istediğinde kademeli olarak ikinci bir faktör eklemesini zorunlu kılın.
Kullanıcıları TOTP MFA'ya kaydetme
Uygulamanızda ikinci faktör olarak TOTP MFA'yı etkinleştirdikten sonra kullanıcıları TOTP MFA'ya kaydetmek için istemci tarafı mantığı 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 uyumlu bir anahtar URI'sini temsil eden bir QR kodunu tarayarak hızlıca yeni TOTP gizli bilgileri ekleyebilir. Bu amaçla bir QR kodu oluşturmak için URI'yı
generateQrCodeUrl()
ile oluşturun ve ardından tercih ettiğ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 kodlarını okuyamayan kimlik doğrulama uygulamalarını desteklemek için her zaman gizli anahtarı gösterin:
// Also display this key: const secret = totpSecret.secretKey;
Kullanıcı, kimlik doğrulama uygulamasına gizli anahtarını ekledikten sonra TOTP'ler oluşturulmaya başlar.
Kullanıcıdan kimlik doğrulayıcı uygulamasında 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. 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 oturumunu ikinci faktörle açma
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";
MFA kullanmıyormuş gibi
signInWith
yöntemlerinden birini çağırın. (Örneğin,signInWithEmailAndPassword()
.) Yöntem birauth/multi-factor-auth-required
hatası verirse uygulamanızın MFA 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 çok faktörlü kimlik doğrulama akışı, kullanıcıdan ilk olarak kullanmak istediği ikinci faktörü seçmesini istemelidir. Bir
MultiFactorResolver
örneğininhints
mülkünü inceleyerek desteklenen ikinci faktörlerin listesini alabilirsiniz:const mfaResolver = getMultiFactorResolver(getAuth(), error); const enrolledFactors = mfaResolver.hints.map(info => info.displayName);
Kullanıcı TOTP'yi kullanmayı seçerse Authenticator 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 et
Bu bölümde, kullanıcının TOTP MFA'dan kaydını iptal etmesi durumunda nasıl işlem yapılacağı açıklanmaktadır.
Birden fazla MFA seçeneğine kaydolan kullanıcılar, en son etkinleştirilen seçenekten kaydını iptal ederse auth/user-token-expired
alır ve oturumları 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ı iptal etmek, 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 programatik olarak çok faktörlü kullanıcıları yönetin.