Identity Platform ile Firebase Authentication'a yükselttiyseniz Flutter uygulamanıza SMS çok öğeli kimlik doğrulaması ekleyebilirsiniz.
Çok öğeli kimlik doğrulaması (MFA), uygulamanızın güvenliğini artırır. Saldırganlar genellikle şifreler ve sosyal hesapların güvenliğini ihlal etse de kısa mesajları ele geçirmek daha zordur.
Başlamadan önce
Çok öğeli kimlik doğrulamayı destekleyen en az bir sağlayıcıyı etkinleştirin. Telefonla kimlik doğrulama, anonim kimlik doğrulama ve Apple Game Center hariç her sağlayıcıda MFA desteklenir.
Uygulamanızın kullanıcı e-postalarını doğruladığından emin olun. Çok faktörlü kimlik doğrulama için e-posta doğrulaması gerekir. Bu, kötü niyetli kişilerin sahip olmadıkları bir e-posta adresiyle hizmete kaydolup ardından ikinci bir faktör ekleyerek gerçek sahibinin hesabına erişmesini engeller.
Android: Uygulamanızın SHA-256 karmasını henüz Firebase konsolunda ayarlamadıysanız ayarlayın. Uygulamanızın SHA-256 karmasını bulma hakkında bilgi için İstemcinizin Kimliğini Doğrulama başlıklı makaleyi inceleyin.
iOS: Xcode'da projeniz için push bildirimlerini etkinleştirin ve APNs kimlik doğrulama anahtarınızın Firebase Cloud Messaging (FCM) ile yapılandırıldığından emin olun. Ayrıca, uzaktan bildirimler için arka plan modlarını etkinleştirmeniz gerekir. Bu adımın ayrıntılı açıklamasını görmek için Firebase iOS Phone Auth belgelerini inceleyin.
Web: Uygulamanızın alanını Firebase konsolunda OAuth yönlendirme alanları bölümüne eklediğinizden emin olun.
Çok öğeli kimlik doğrulamayı etkinleştirme
Firebase konsolunun Kimlik doğrulama > Oturum açma yöntemi sayfasını açın.
Gelişmiş bölümünde SMS ile Çok Öğeli Kimlik Doğrulaması'nı etkinleştirin.
Uygulamanızı test ederken kullanacağınız telefon numaralarını da girmeniz gerekir. Test telefon numaralarını kaydetmek isteğe bağlı olsa da geliştirme sırasında sıklık sınırlamasıyla karşılaşmamak için kesinlikle önerilir.
Uygulamanızın alanını henüz yetkilendirmediyseniz Firebase konsolunun Kimlik Doğrulama > Ayarlar sayfasındaki izin verilenler listesine ekleyin.
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. Çok öğeli kimlik doğrulamayı zorunlu kılmak yerine teşvik etmek isteyen uygulamalar bu yaklaşımı tercih edebilir.
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.
İkinci bir faktör kaydetme
Bir kullanıcı için yeni bir ikincil etmen kaydetmek üzere:
Kullanıcının kimliğini yeniden doğrulayın.
Kullanıcıdan telefon numarasını girmesini isteyin.
Kullanıcı için çok öğeli oturum alma:
final multiFactorSession = await user.multiFactor.getSession();Telefon numarasını çok faktörlü oturum ve geri aramalarınızla doğrulayın:
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: multiFactorSession, phoneNumber: phoneNumber, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // The SMS verification code has been sent to the provided phone number. // ... }, codeAutoRetrievalTimeout: (_) {}, );SMS kodu gönderildikten sonra kullanıcıdan kodu doğrulamasını isteyin:
final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, );Kaydolma işlemini tamamlayın:
await user.multiFactor.enroll( PhoneMultiFactorGenerator.getAssertion( credential, ), );
Aşağıdaki kodda, ikinci faktör kaydetme işleminin tam bir örneği gösterilmektedir:
final session = await user.multiFactor.getSession();
final auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
multiFactorSession: session,
phoneNumber: phoneController.text,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await user.multiFactor.enroll(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
Tebrikler! Bir kullanıcı için ikinci bir kimlik doğrulama etmenini başarıyla kaydettiniz.
Kullanıcıların ikinci bir faktörle oturum açmasını sağlama
Bir kullanıcının iki faktörlü SMS doğrulamasıyla oturum açmasını sağlamak için:
Kullanıcının ilk faktörüyle oturum açmasını sağlayın, ardından
FirebaseAuthMultiFactorExceptionistisnasını yakalayın. Bu hata, kullanıcının kayıtlı ikinci faktörlerini almak için kullanabileceğiniz bir çözümleyici içerir. Ayrıca, kullanıcının birinci öğeyle kimliğini başarıyla doğruladığını kanıtlayan temel bir oturum da içerir.Örneğin, kullanıcının ilk faktörü e-posta ve şifre ise:
try { await _auth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text, ); // User is not enrolled with a second factor and is successfully // signed in. // ... } on FirebaseAuthMultiFactorException catch (e) { // The user is a multi-factor user. Second factor challenge is required final resolver = e.resolver // ... }Kullanıcının kayıtlı birden fazla ikincil etmeni varsa hangisini kullanmak istediğini sorun:
final session = e.resolver.session; final hint = e.resolver.hints[selectedHint];İpucu ve çok öğeli kimlik doğrulama oturumu ile birlikte kullanıcının telefonuna bir doğrulama mesajı gönderin:
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: session, multiFactorInfo: hint, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // ... }, codeAutoRetrievalTimeout: (_) {}, );İkincil kimlik doğrulamayı tamamlamak için
resolver.resolveSignIn()numaralı telefonu arayın:final smsCode = await getSmsCodeFromUser(context); if (smsCode != null) { // Create a PhoneAuthCredential with the code final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, ); try { await e.resolver.resolveSignIn( PhoneMultiFactorGenerator.getAssertion(credential) ); } on FirebaseAuthException catch (e) { print(e.message); } }
Aşağıdaki kodda, çok faktörlü bir kullanıcının oturum açmasıyla ilgili eksiksiz bir örnek gösterilmektedir:
try {
await _auth.signInWithEmailAndPassword(
email: emailController.text,
password: passwordController.text,
);
} on FirebaseAuthMultiFactorException catch (e) {
setState(() {
error = '${e.message}';
});
final firstHint = e.resolver.hints.first;
if (firstHint is! PhoneMultiFactorInfo) {
return;
}
await FirebaseAuth.instance.verifyPhoneNumber(
multiFactorSession: e.resolver.session,
multiFactorInfo: firstHint,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await e.resolver.resolveSignIn(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
} catch (e) {
...
}
Tebrikler! Çok öğeli kimlik doğrulamayı kullanarak bir kullanıcının oturumunu başarıyla açtınız.
Sırada ne var?
- Yönetici SDK'sı ile çok öğeli kullanıcıları programlı bir şekilde yönetin.