Telefonla kimlik doğrulama, kullanıcıların telefonlarını kimlik doğrulayıcı olarak kullanarak Firebase'de oturum açmasına olanak tanır. Kullanıcıya (sağlanan 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 amacıyla Google tarafından gönderilecek ve saklanacaktır. Geliştiriciler, Firebase Authentication telefon numarasıyla oturum açma hizmetini kullanmadan önce uygun son kullanıcı iznine sahip olduklarından emin olmalıdır.authentication
Firebase Telefon Kimlik Doğrulaması tüm ülkelerde desteklenmez. Daha fazla bilgi için lütfen SSS'lerine bakın.
Kurmak
Telefon Kimlik Doğrulamasına başlamadan önce şu adımları izlediğinizden emin olun:
- Firebase konsolunda Oturum Açma yöntemi olarak Telefonu etkinleştirin.
- Android : Firebase konsolunda uygulamanızın SHA-1 karmasını henüz ayarlamadıysanız bunu yapın. Uygulamanızın SHA-1 karma değerini bulma hakkında bilgi için İstemcinizin Kimlik Doğrulamasını Yapma konusuna bakın.
- iOS : Xcode'da projeniz için anında bildirimleri etkinleştirin ve APN 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ı da etkinleştirmeniz gerekir. Bu adımın ayrıntılı açıklamasını görüntülemek için Firebase iOS Phone Auth belgelerine bakın.
- Web : Uygulama alan adınızı Firebase konsolunda OAuth yönlendirme alan adları altına 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 emülatörlerinde test etmek için lütfen Test Etme bölümüne bakın.
Kullanım
Flutter için Firebase Authentication SDK'sı, bir kullanıcının telefon numarasıyla oturum açması için iki ayrı yol sunar. Yerel (örn. Android ve iOS) platformlar, bir telefon numarasını doğrulamak için web'den farklı işlevsellik sağlar, bu nedenle her platform için özel olarak iki yöntem mevcuttur:
- Yerel Platform :
verifyPhoneNumber
. - Web Platformu :
signInWithPhoneNumber
.
Yerel: verifyPhoneNumber
Yerel platformlarda, öncelikle 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:
- doğrulama Tamamlandı : Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
- doğrulamaFailed : Geçersiz telefon numaraları veya SMS kotasının aşılıp aşılmadığı gibi hata olaylarını yönetin.
- codeSent : Firebase'den cihaza bir kod gönderildiğinde, kullanıcılardan kodu girmelerini istemek için kullanılır.
- codeAutoRetrievalTimeout : Otomatik SMS kodu işleme başarısız olduğunda zaman aşımını yönetin.
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, oturum açmak veya kullanıcının telefon numarasına bağlanmak 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ı nedeniyle bir hata döndürürse veya projenin SMS kotası aşılırsa bu işleyiciye bir FirebaseAuthException
gönderilecektir. Bu durumda, hata koduna bağlı olarak kullanıcınıza bir şeylerin ters gittiğini bildirirsiniz.
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 ( 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 isteyecek şekilde uygulama kullanıcı arayüzünüzü güncellemeniz 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ş olan yeni bir SMS mesajını varsayılan olarak yeniden göndermez. Ancak, forceResendingToken
bağımsız değişkenine yeniden gönderme belirteciyle verifyPhoneNumber
yöntemini yeniden çağırarak bu davranışı geçersiz kılabilirsiniz. Başarılı olursa SMS mesajı yeniden gönderilecektir.
codeAutoRetrievalTimeout
Otomatik SMS kod çözümlemesini destekleyen Android cihazlarda, cihazın bir SMS mesajını belirli bir zaman dilimi içinde otomatik olarak çözmemesi durumunda bu işleyici çağrılacaktır. Zaman aralığı geçtikten sonra cihaz artık gelen mesajları çözümlemeye çalışmayacaktır.
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 telefona erişimleri olduğunu onaylayarak oturum açabilirler. Daha fazla güvenlik ve spam önleme için kullanıcılardan bir Google reCAPTCHA widget'ını doldurarak 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 kutudan çıkar çıkmaz yönetir, ancak gerektiğinde nasıl görüntüleneceği ve yapılandırılacağı üzerinde kontrol sağlar. Başlamak için telefon numarasıyla signInWithPhoneNumber
yöntemini arayı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ı ilk önce reCAPTCHA widget'ının görüntülenmesini tetikleyecektir. Kullanıcının SMS kodu gönderilmeden önce testi tamamlaması gerekir. Tamamlandıktan sonra, çözümlenen 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ı gibi başarılı bir oturum açma, uygulamanız boyunca abone olduğunuz 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 argümanı, widget'ı yönetmek için kullanılabilecek isteğe bağlı bir RecaptchaVerifier
örneğini kabul eder. Varsayılan olarak widget, oturum açma akışı tetiklendiğinde görünmez bir widget olarak oluşturulur. "Görünmez" bir widget, uygulamanızın üstünde tam sayfa modal olarak görünecektir.
Ancak 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 widget eklemek için RecaptchaVerifier
örneğinin container
bağımsız değişkenine bir DOM öğesi kimliği belirtin. Öğe mevcut olmalı ve boş olmalıdır, aksi takdirde bir hata atılır. Hiçbir container
argümanı sağlanmazsa, widget "görünmez" olarak işlenecektir.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
container: 'recaptcha',
size: RecaptchaVerifierSize.compact,
theme: RecaptchaVerifierTheme.dark,
));
Yukarıda gösterildiği gibi size
ve theme
bağımsız değişkenlerini özelleştirerek isteğe bağlı olarak boyutu ve temayı değiştirebilirsiniz.
Ayrıca reCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, reCAPTCHA'nın süresinin dolup dolmadığı veya bir hata atılıp atılmadığı 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üne tıklayın.
- Yeni bir telefon numarası (örn
+44 7444 555666
) ve test kodunu (örn.123456
) girin.
verifyPhoneNumber
veya signInWithPhoneNumber
yöntemlerine bir test telefon numarası sağlıyorsanız aslında hiçbir SMS gönderilmez. Bunun yerine test kodunu doğrudan PhoneAuthProvider
veya signInWithPhoneNumber
onay sonucu işleyicisini kullanarak sağlayabilirsiniz.