Telefonla Kimlik Doğrulama

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. SMS mesajı gönderildi benzersiz bir kod içeren (verilen telefon numarasını kullanarak) kullanıcıya gönderin. Kod yetkilendirildikten sonra kullanıcı oturum açabilir Firebase'e aktarıyoruz.

Son kullanıcıların kimlik doğrulama için sağladığı telefon numaraları, spam ve kötüye kullanımı iyileştirmek amacıyla Google tarafından gönderilip depolanır Firebase dahil ancak bunlarla sınırlı olmamak üzere Google hizmetlerinde önleme amaçlıdır. Geliştiriciler, mobil cihazlarda Firebase Authentication telefon numarası oturum açma hizmeti.authentication kullanmadan önce gerekli son kullanıcı izni

Firebase Telefonla Kimlik Doğrulama tüm ülkelerde desteklenmez. Daha fazla bilgi edinmek için lütfen yayıncının SSS sayfasına bakın.

Kurulum

Telefonla Kimlik Doğrulama özelliğini kullanmaya başlamadan önce şu adımları uyguladığınızdan emin olun:

  1. Firebase konsolunda Telefonu, Oturum Açma yöntemi olarak etkinleştirin.
  2. Android: Firebase konsolunda uygulamanızın SHA-1 karmasını henüz ayarlamadıysanız bunu yapın. Uygulamanızın SHA-1 karmasını bulma hakkında bilgi edinmek için İstemcinizin kimliğini doğrulama başlıklı makaleye bakın.
  3. iOS: Xcode'da projeniz için push bildirimlerini etkinleştirin ve sağlamak APNs kimlik doğrulama anahtarınız Firebase Cloud Messaging (FCM) ile yapılandırılır. Ayrıca, uzaktan bildirimler için arka plan modlarını etkinleştirin. Bu adımla ilgili ayrıntılı açıklamayı görüntülemek için Firebase iOS Phone Auth dokümanlarına bakın.
  4. Web: Uygulama alan adınızı Firebase konsolunda, OAuth yönlendirme alan adları.

Not; Telefon numarasıyla oturum açma özelliği 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 bölümüne bakın.

Kullanım

Flutter için Firebase Authentication SDK, kullanıcıların telefon numarasıyla oturum açmasını sağlamak 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 vardır. Bu nedenle, her platform için özel olarak iki yöntem mevcuttur:

  • Yerel Platform: verifyPhoneNumber.
  • Web Platformu: signInWithPhoneNumber.

Yerel: verifyPhoneNumber

Yerel platformlarda, önce kullanıcının telefon numarası doğrulanmalıdır. Ardından kullanıcı oturum açabilir veya hesabını bir PhoneAuthCredential

Öncelikle kullanıcıdan telefon numarasını istemelisiniz. 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 çağırma vardır. Bunların her biri, uygulama kullanıcı arayüzünü nasıl güncelleyeceğinizi belirler:

  1. verificationTamamlandı: Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
  2. verificationFailed: Geçersiz telefon numaraları veya SMS kotasının aşılması gibi hata olaylarını ele alın.
  3. codeSent: Firebase'den cihaza gönderilen bir kodu işleyin. Bu işlem, kullanıcılardan kodu girmelerini istemek için kullanılır.
  4. codeAutoRetrieval1: Otomatik SMS kodu işleme başarısız olduğunda ortaya çıkan zaman aşımını ele alın.

doğrulamaTamamlandı

Bu işleyici yalnızca otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda çağrılacaktır.

Android, SMS kodu cihaza iletildiğinde SMS kodunu otomatik olarak doğrular. Kullanıcının kodu manuel olarak girmesini gerektirir. Bu etkinlik gerçekleşirse otomatik olarak bir PhoneAuthCredential sağlanır. Kullanıcının telefon numarasıyla oturum açmak veya bu numaraya bağlantı vermek için kullanılı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, yanlış telefon numarası gibi bir hata döndürürse veya projenin SMS kotası aşılmışsa bu işleyiciye bir FirebaseAuthException gönderilir. Bu durumda, kullanıcınıza hataya bağlı olarak bir şeylerin ters gittiğini sorarsınız girin.

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 SMS kodu gönderdiğinde bu işleyici bir verificationId ve resendToken (resendToken) ile tetiklenir. yalnızca Android cihazlarda desteklenir. iOS cihazlar her zaman null değeri döndürür.)

Tetiklendikten sonra uygulamanızın kullanıcı arayüzünü, kullanıcıdan beklediği SMS kodunu girmesini isteyecek şekilde güncellemek iyi bir zamandır. SMS kodu girildikten sonra, doğrulama kimliğini SMS koduyla birleştirerek yeni bir PhoneAuthCredential oluşturabilirsiniz:

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ını kısa bir süre önce gönderilmişse yeniden göndermez. Ancak bu davranışı geçersiz kılabilirsiniz yeniden gönderme jetonuyla verifyPhoneNumber yöntemini forceResendingToken bağımsız değişkenine tekrar çağırarak. İşlem başarılı olursa SMS mesajı yeniden gönderilir.

codeAutoRetrievalZaman Aşımı

Otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda, cihaz otomatik olarak bir SMS mesajını belirli bir zaman aralığı içinde çözdü. Zaman aralığı geçtikten sonra cihaz artık çözüm girişiminde bulunmaz mesajı görebilirsiniz.

Varsayılan olarak cihaz 30 saniye bekler, ancak bu süre timeout bağımsız değişkeniyle ö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, sağlanan telefon numarasına gönderilen SMS kodunu girerek telefona erişimleri olduğunu onaylayarak oturum açabilir. Daha fazla güvenlik ve spam önleme için kullanıcılardan bir Google reCAPTCHA'yı doldurarak gerçek kişi olduklarını kanıtlamaları istenir. widget'ını tıklayın. Onaylandıktan sonra SMS kodu gönderilir.

Flutter için Firebase Authentication SDK, reCAPTCHA widget'ını varsayılan olarak kullanıma hazır şekilde yönetir ancak gerekirse nasıl gösterileceği ve yapılandırılacağı konusunda kontrol sağlar. Başlamak için telefon numarası ile 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 olarak reCAPTCHA widget'ının gösterilmesini tetikler. Kullanıcı test etmeniz gerekir. Bu işlem tamamlandıktan sonra, Çözümlenmiş ConfirmationResult yanıtında confirm yöntemine SMS kodu:

UserCredential userCredential = await confirmationResult.confirm('123456');

Diğer oturum açma akışlarında olduğu gibi, başarılı bir oturum açma işlemi kimlik doğrulama durumu işleyicilerini de tetikler. ve mevcut abone sayınızdır.

reCAPTCHA Yapılandırması

reCAPTCHA widget'ı, web uygulamanızın güvenliğini sağlayan ve tümüyle yönetilen bir akıştır.

signInWithPhoneNumber bağımsız değişkeni, kullanılabilecek isteğe bağlı bir RecaptchaVerifier örneğini kabul ediyor widget'ı yönetin. Varsayılan olarak, oturum açma akışı tetiklendiğinde widget görünmez bir widget olarak oluşturulur. "Görünmez" widget'ı, uygulamanızın üst kısmında tam sayfa kalıcı bir kalıcı iletişim kutusu olarak görünür.

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ülenebilir.

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 ve boş olmalıdır, aksi takdirde hata verilir. container bağımsız değişkeni sağlanmazsa widget "görünmez" olarak oluşturulur.

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

İsterseniz yukarıda gösterildiği gibi size ve theme bağımsız değişkenlerini özelleştirerek boyutu ve temayı değiştirebilirsiniz.

Ayrıca reCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, testin kullanıcı tarafından tamamlanıp tamamlanmadığı gibi etkinlikleri, reCAPTCHA sona erdi veya bir hata oluştu:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

Test

Firebase, telefon numaralarının yerel olarak test edilmesi için destek sağlar:

  1. Firebase Konsolu'nda "Telefon"u seçin. kimlik doğrulama sağlayıcıyı seçin ve "Test için telefon numaraları"nı tıklayın. açılır.
  2. Yeni bir telefon numarası (ör. +44 7444 555666) ve bir test kodu (ör. 123456) girin.

verifyPhoneNumber veya signInWithPhoneNumber yöntemlerinden birine test telefon numarası sağlanırsa aslında SMS gönderilmez. Siz bunun yerine test kodunu doğrudan PhoneAuthProvider veya signInWithPhoneNumber ürününün onay sonucu işleyicisine sağlayabilir.