Telefonla kimlik doğrulama, 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ğrulaması 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 Kimlik Doğrulama telefon numarası ile oturum açma service.authentication'ı kullanmadan önce uygun son kullanıcı onayına sahip olduklarından emin olmalıdır.
Firebase Telefonla Kimlik Doğrulama tüm ülkelerde desteklenmez. Daha fazla bilgi için lütfen SSS'lerine 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 : Firebase konsolunda uygulamanızın SHA-1 karmasını henüz ayarlamadıysanız yapın. Uygulamanızın SHA-1 karmasını bulma hakkında bilgi için İstemcinizin Kimliğini Doğrulama bölümüne bakın.
- iOS : Xcode'da projeniz için anında iletme bildirimlerini etkinleştirin ve APNs kimlik doğrulama anahtarınızın Firebase Cloud Messaging (FCM) ile yapılandırıldığından emin olun. Bu adımın ayrıntılı bir açıklamasını görmek için Firebase iOS Phone Auth belgelerine bakın.
- Web : Uygulama alan adınızı Firebase konsolunda , OAuth yönlendirme alanları altında 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 Kimlik Doğrulama SDK'sı, bir kullanıcının telefon numarasıyla oturum açması için iki ayrı yol sağlar. 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, 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) {},
);
Her biri uygulama kullanıcı arayüzünü nasıl güncelleyeceğinizi belirleyen 4 ayrı geri arama vardır:
- doğrulama Tamamlandı : Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
- doğrulama Failed : Geçersiz telefon numaraları veya SMS kotasının aşılıp aşılmadığı gibi arıza olaylarını işleyin.
- codeSent : Kullanıcılardan kodu girmelerini istemek için kullanılan Firebase'den cihaza bir kod gönderildiğinde işleyin.
- codeAutoRetrievalTimeout : Otomatik SMS kodu işlemenin başarısız olduğu bir zaman aşımını yönetin.
doğrulamaTamamlandı
Bu işleyici yalnızca otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda çağrılı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 bu numarayı 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ızdan 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
kimliği 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 bekledikleri SMS kodunu girmesini istemek için uygulama kullanıcı arayüzünüzü 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);
},
);
Varsayılan olarak, Firebase yeni bir SMS mesajı gönderildiyse yeniden göndermez. Ancak, yeniden gönderme belirteci ile doğrulamaPhoneNumber yöntemini verifyPhoneNumber
bağımsız değişkenine yeniden çağırarak bu davranışı geçersiz forceResendingToken
. Başarılı olursa, SMS mesajı yeniden gönderilecektir.
kodOtomatik AlmaZaman aşımı
Otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda, cihaz bir SMS mesajını belirli bir zaman dilimi içinde otomatik olarak çözmediyse bu işleyici çağrılır. Zaman aralığı geçtikten sonra, cihaz artık gelen mesajları çözmeye ç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 bir telefona erişimleri olduğunu onaylayarak giriş yapabilirler. 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 kutunun dışında yönetir, ancak gerekirse 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ı, önce reCAPTCHA pencere öğesinin görüntülenmesini tetikleyecektir. Kullanıcı, bir SMS kodu gönderilmeden önce testi tamamlamalıdır. Tamamlandığında, çözümlenen ConfirmationResult
yanıtındaki confirm
yöntemine SMS kodunu sağlayarak kullanıcıyı oturum 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 tüm kimlik doğrulama durumu dinleyicilerini tetikleyecektir.
reCAPTCHA Yapılandırması
reCAPTCHA pencere aracı, web uygulamanız için güvenlik sağlayan tam olarak yönetilen bir akıştır.
RecaptchaVerifier
öğesinin ikinci argümanı, pencere öğesini yönetmek için kullanılabilecek isteğe bağlı bir signInWithPhoneNumber
örneğini kabul eder. Varsayılan olarak, oturum açma akışı tetiklendiğinde pencere öğesi görünmez bir pencere öğesi olarak işlenir. "Görünmez" bir widget, uygulamanızın üzerinde tam sayfa bir modal olarak görünecektir.
Bununla birlikte, kullanıcının kendilerini 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
bağımsız değişkenine bir DOM öğesi kimliği belirtin. Öğe var olmalı ve boş olmalıdır, aksi takdirde bir hata verilir. container
bağımsız değişkeni sağlanmazsa, pencere öğesi "görünmez" olarak işlenecektir.
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 boyutu ve temayı değiştirebilirsiniz.
Ayrıca reCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, reCAPTCHA'nın süresinin dolması veya bir hatanın 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ı yerel olarak test etmek 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 bir test kodu (örn.123456
) girin.
DoğrulamaPhoneNumber veya verifyPhoneNumber
yöntemlerine bir test telefon numarası signInWithPhoneNumber
, aslında hiçbir SMS gönderilmeyecektir. Bunun yerine test kodunu doğrudan PhoneAuthProvider
veya signInWithPhoneNumber
onay sonuç işleyicisine sağlayabilirsiniz.