Telefon kimlik doğrulaması, kullanıcıların kimlik doğrulayıcı olarak telefonlarını kullanarak Firebase'de oturum açmasına olanak tanır. Kullanıcıya (verilen telefon numarası kullanılarak) benzersiz bir kod içeren bir SMS mesajı gönderilir. Kod yetkilendirildikten sonra, kullanıcı Firebase'de oturum açabilir.
Son kullanıcıların kimlik doğrulama için sağladığı telefon numaraları, Firebase dahil ancak bununla sınırlı olmamak üzere Google hizmetinde spam ve kötüye kullanımın önlenmesini iyileştirmek için Google tarafından gönderilecek ve saklanacaktır. Geliştiriciler, Firebase Authentication telefon numarası oturum açma hizmetini kullanmadan önce uygun son kullanıcı onayına sahip olduklarından emin olmalıdır.
Firebase Telefonla Kimlik Doğrulaması tüm ülkelerde desteklenmez. Daha fazla bilgi için lütfen SSS bölümüne bakın.
Kurmak
Telefonla Kimlik Doğrulamaya başlamadan önce şu adımları uyguladığınızdan emin olun:
- Firebase konsolunda Telefonu Oturum Açma yöntemi olarak etkinleştirin.
- Android : Uygulamanızın SHA-1 karmasını Firebase konsolunda henüz ayarlamadıysanız, bunu yapın. Uygulamanızın SHA-1 hash'ini bulma hakkında bilgi için Müşterinizin Kimliğini Doğrulama bölümüne bakın.
- iOS : Xcode'da projeniz için anında iletme bildirimlerini etkinleştirin ve APN'ler kimlik doğrulama anahtarınızın Firebase Cloud Messaging (FCM) ile yapılandırıldığından emin olun. Ek olarak, uzak bildirimler için arka plan modlarını etkinleştirmelisiniz . Bu adımın ayrıntılı açıklamasını görmek için Firebase iOS Phone Auth belgelerini görüntüleyin.
- Web : OAuth yönlendirme etki alanları altında Firebase konsolunda uygulama etki alanınızı eklediğinizden emin olun .
Not ; Telefon numarasıyla oturum açma, yalnızca gerçek cihazlarda ve web'de kullanılabilir. Kimlik doğrulama akışınızı cihaz öykünücülerinde test etmek için lütfen Test Etme bölümüne bakın.
Kullanım
Flutter için Firebase Authentication SDK, bir kullanıcının telefon numarasıyla oturum açması için iki ayrı yol sunar. Yerel (ör. Android ve iOS) platformlar, bir telefon numarasını doğrulamak için web'den farklı işlevler sağlar, bu nedenle her platform için özel olarak iki yöntem vardır:
- Yerel Platform :
verifyPhoneNumber
. - Web Platformu :
signInWithPhoneNumber
.
Yerel: verifyPhoneNumber
Yerel platformlarda, önce kullanıcının telefon numarasının doğrulanması gerekir ve ardından kullanıcı oturum açabilir veya hesabını bir PhoneAuthCredential
ile bağlayabilir.
Öncelikle kullanıcıdan telefon numarasını istemeniz gerekir. Sağlandıktan sonra, verifyPhoneNumber()
yöntemini çağırın:
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationCompleted: (PhoneAuthCredential credential) {},
verificationFailed: (FirebaseAuthException e) {},
codeSent: (String verificationId, int? resendToken) {},
codeAutoRetrievalTimeout: (String verificationId) {},
);
İşlemeniz gereken 4 ayrı geri arama vardır ve her biri uygulama kullanıcı arayüzünü nasıl güncelleyeceğinizi belirleyecektir:
- VerificationCompleted : Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
- VerificationFailed : Geçersiz telefon numaraları veya SMS kotasının aşılıp aşılmadığı gibi hata olaylarını işleyin.
- codeSent : Cihaza Firebase'den bir kod gönderildiğinde işlenir ve kullanıcılardan kodu girmelerini istemek için kullanılır.
- codeAutoRetrievalTimeout : Otomatik SMS kodu işlemenin başarısız olduğu bir zaman aşımını işleyin.
doğrulamaTamamlandı
Bu işleyici, yalnızca otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda çağrılacaktır.
SMS kodu cihaza teslim edildiğinde, Android, kullanıcının kodu manuel olarak girmesine gerek kalmadan SMS kodunu otomatik olarak doğrulayacaktır. Bu olay meydana gelirse, kullanıcının telefon numarasıyla oturum açmak veya telefon numarasını bağlamak için kullanılabilecek bir PhoneAuthCredential
otomatik olarak sağlanır.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationCompleted: (PhoneAuthCredential credential) async {
// ANDROID ONLY!
// Sign the user in (or link) with the auto-generated credential
await auth.signInWithCredential(credential);
},
);
doğrulama başarısız oldu
Firebase, örneğin yanlış bir telefon numarası için bir hata döndürürse veya proje için SMS kotası aşılırsa, bu işleyiciye bir FirebaseAuthException
gönderilir. Bu durumda, kullanıcınıza hata koduna bağlı olarak bir şeylerin ters gittiğini sorarsınız.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationFailed: (FirebaseAuthException e) {
if (e.code == 'invalid-phone-number') {
print('The provided phone number is not valid.');
}
// Handle other errors
},
);
Kod gönderildi
Firebase cihaza bir SMS kodu gönderdiğinde, bu işleyici bir verificationId
ve resendToken
ile tetiklenir (Bir resendToken
yalnızca Android cihazlarda desteklenir, iOS cihazları her zaman null
bir değer döndürür).
Tetiklendikten sonra, kullanıcıdan beklediği SMS kodunu girmesini istemek için uygulamanızın kullanıcı arayüzünü güncellemek için iyi bir zaman olacaktır. SMS kodu girildikten sonra, yeni bir PhoneAuthCredential
oluşturmak için doğrulama kimliğini SMS koduyla birleştirebilirsiniz:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
codeSent: (String verificationId, int? resendToken) async {
// Update the UI - wait for the user to enter the SMS code
String smsCode = 'xxxx';
// Create a PhoneAuthCredential with the code
PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);
// Sign the user in (or link) with the credential
await auth.signInWithCredential(credential);
},
);
Firebase, yakın zamanda gönderilmişse yeni bir SMS mesajını varsayılan olarak yeniden göndermez. Ancak, forceResendingToken
bağımsız değişkenine yeniden gönderme belirteci ile verifyPhoneNumber
yöntemini yeniden çağırarak bu davranışı geçersiz kılabilirsiniz. Başarılı olursa, SMS mesajı yeniden gönderilir.
kodOtomatik AlmaZaman Aşımı
Otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda, cihaz bir SMS mesajını belirli bir süre içinde otomatik olarak çözmezse bu işleyici çağrılır. Zaman çerçevesi geçtikten sonra, cihaz artık gelen mesajları çözmeye çalışmaz.
Varsayılan olarak, cihaz 30 saniye bekler ancak bu, timeout
argümanıyla özelleştirilebilir:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
timeout: const Duration(seconds: 60),
codeAutoRetrievalTimeout: (String verificationId) {
// Auto-resolution timed out...
},
);
Web: signInWithPhoneNumber
Web platformlarında, kullanıcılar verilen telefon numarasına gönderilen SMS kodunu girerek bir telefona erişimi olduğunu onaylayarak oturum açabilirler. Ek güvenlik ve spam önleme için, kullanıcılardan bir Google reCAPTCHA widget'ını tamamlayarak insan olduklarını kanıtlamaları istenir. Onaylandıktan sonra SMS kodu gönderilecektir.
Flutter için Firebase Authentication SDK, reCAPTCHA widget'ını varsayılan olarak yönetir, ancak gerekirse nasıl görüntülendiği ve yapılandırıldığı üzerinde kontrol sağlar. Başlamak için telefon numarasıyla signInWithPhoneNumber
yöntemini çağırın.
FirebaseAuth auth = FirebaseAuth.instance;
// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');
Yöntemin çağrılması, önce reCAPTCHA widget'ının görüntülenmesini tetikler. Kullanıcı, bir SMS kodu gönderilmeden önce testi tamamlamalıdır. Tamamlandıktan sonra, çözülmüş olan ConfirmationResult
yanıtındaki confirm
yöntemine SMS kodunu sağlayarak kullanıcının oturumunu açabilirsiniz:
UserCredential userCredential = await confirmationResult.confirm('123456');
Diğer oturum açma akışlarında olduğu gibi, başarılı bir oturum açma, uygulamanız boyunca abone olduğunuz tüm kimlik doğrulama durumu dinleyicilerini tetikleyecektir.
reCAPTCHA Yapılandırması
reCAPTCHA widget'ı, web uygulamanıza güvenlik sağlayan, tamamen yönetilen bir akıştır.
signInWithPhoneNumber
ikinci bağımsız değişkeni, parçacığı yönetmek için kullanılabilecek isteğe bağlı bir RecaptchaVerifier
örneğini kabul eder. Varsayılan olarak pencere öğesi, oturum açma akışı tetiklendiğinde görünmez bir pencere öğesi olarak işlenir. "Görünmez" bir widget, uygulamanızın üstünde tam sayfa bir modal olarak görünecektir.
Bununla birlikte, kullanıcının kendisini doğrulamak için açıkça basması gereken bir satır içi widget'ı görüntülemek mümkündür.
Satır içi pencere öğesi eklemek için RecaptchaVerifier
örneğinin container
değişkenine bir DOM öğesi kimliği belirtin. Öğe var olmalı ve boş olmalıdır, aksi takdirde bir hata atılır. container
değişkeni sağlanmazsa pencere öğesi "görünmez" olarak işlenir.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
container: 'recaptcha',
size: RecaptchaVerifierSize.compact,
theme: RecaptchaVerifierTheme.dark,
));
size
ve theme
bağımsız değişkenlerini yukarıda gösterildiği gibi özelleştirerek isteğe bağlı olarak boyut ve temayı değiştirebilirsiniz.
ReCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, reCAPTCHA'nın süresinin dolması veya bir hata atılması gibi olayları da dinlemek mümkündür:
RecaptchaVerifier(
onSuccess: () => print('reCAPTCHA Completed!'),
onError: (FirebaseAuthException error) => print(error),
onExpired: () => print('reCAPTCHA Expired!'),
);
Test yapmak
Firebase, telefon numaralarının yerel olarak test edilmesi için destek sağlar:
- Firebase Konsolunda, "Telefon" kimlik doğrulama sağlayıcısını seçin ve "Test için telefon numaraları" açılır menüsünü tıklayın.
- Yeni bir telefon numarası (örn
+44 7444 555666
) ve bir test kodu (örn.123456
) girin.
verifyPhoneNumber
veya signInWithPhoneNumber
yöntemlerine bir test telefon numarası verilirse, gerçekte SMS gönderilmez. Bunun yerine test kodunu doğrudan PhoneAuthProvider
veya signInWithPhoneNumber
onay sonucu işleyicisine sağlayabilirsiniz.