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. Kullanıcıya, benzersiz bir kod içeren (sağlanan telefon numarası kullanılarak) 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 bunlarla sınırlı olmamak üzere Google hizmetlerinde spam ve kötüye kullanımı önlemenin iyileştirilmesi amacıyla Google tarafından gönderilir ve saklanır. Geliştiriciler, Firebase Authentication telefon numarası oturum açma hizmetini kullanmadan önce uygun son kullanıcı iznini aldıklarından emin olmalıdır.

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ı makaleyi inceleyin.
  3. 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ımla ilgili ayrıntılı açıklamayı görüntülemek için Firebase iOS Phone Auth dokümanlarına bakın.
  4. Web: Uygulamalarınızın alan adını Firebase konsolunda, OAuth yönlendirme alanları altına eklediğinizden emin olun.

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, telefon numarasını doğrulamak için web'den farklı işlevler sunar. 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ı doğrulanmalıdır. Ardından kullanıcı oturum açabilir veya hesabını bir PhoneAuthCredential ile bağlayabilir.

Ö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.

SMS kodu cihaza iletildiğinde Android, kullanıcının kodu manuel olarak girmesini gerektirmeden SMS kodunu otomatik olarak doğrular. Bu etkinlik gerçekleştiğinde, kullanıcının telefon numarasıyla oturum açmak veya bu numaraya bağlantı vermek 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, yanlış telefon numarası gibi bir hata döndürürse veya projenin 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 (resendToken yalnızca Android cihazlarda desteklenir, iOS cihazlar her zaman null değerini 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. Bununla birlikte, yeniden gönderme jetonuyla verifyPhoneNumber yöntemini forceResendingToken bağımsız değişkenine yeniden çağırarak bu davranışı geçersiz kılabilirsiniz. İşlem başarılı olursa SMS mesajı yeniden gönderilir.

codeAutoRetrievalZaman Aşımı

Otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda, cihaz belirli bir zaman aralığında bir SMS mesajını otomatik olarak çözmediyse bu işleyici çağrılır. Bu süre geçtikten sonra cihaz artık gelen mesajları çözümlemeye çalışmaz.

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 amacıyla, kullanıcılardan bir Google reCAPTCHA widget'ını doldurarak gerçek kişi olduklarını kanıtlamaları istenir. 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. SMS kodu gönderilmeden önce kullanıcının testi tamamlaması gerekir. İşlem tamamlandığında, SMS kodunu çözümlenen ConfirmationResult yanıtında confirm yöntemine sağlayarak kullanıcının oturum açmasını sağlayabilirsiniz:

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, uygulamanız boyunca abone olduğunuz tüm kimlik doğrulama durumu işleyicilerini tetikler.

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 öğesinin ikinci bağımsız değişkeni, widget'ı yönetmek için kullanılabilecek isteğe bağlı bir RecaptchaVerifier örneğini kabul eder. 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ünde tam sayfa bir kalıcı mod 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.

reCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, reCAPTCHA süresinin dolması veya hata gönderilmesi gibi etkinlikleri dinlemek de mümkündür:

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 konsolunda "Telefon" kimlik doğrulama sağlayıcısını seçin ve "Test için kullanılacak telefon numaraları" açılır listesini tıklayın.
  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. Bunun yerine test kodunu doğrudan PhoneAuthProvider veya signInWithPhoneNumbers onay sonucu işleyici ile sağlayabilirsiniz.