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 (belirtilen telefon numarası kullanılarak) benzersiz bir kod içeren 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ı, Google hizmetlerinde (Firebase dahil ancak bununla sınırlı olmamak üzere) spam ve kötüye kullanımı önlemeyi iyileştirmek için Google tarafından gönderilir ve depolanır. Geliştiriciler, Firebase Authentication telefon numarasıyla oturum açma hizmetini kullanmadan önce uygun son kullanıcı iznini aldıklarından emin olmalıdır.

Firebase Telefonla Kimlik Doğrulama özelliği tüm ülkelerde desteklenmez. Daha fazla bilgi için lütfen SSS sayfalarını inceleyin.

Kurulum

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

  1. Firebase konsolunda telefonla oturum açma yöntemini etkinleştirin.
  2. Android: Uygulamanızın SHA-1 karmasını henüz Firebase konsolunda ayarlamadıysanız ayarlayı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ımın ayrıntılı açıklamasını görmek için Firebase iOS Phone Auth belgelerini inceleyin.
  4. Web: Uygulamanızın alanını Firebase konsolunda OAuth yönlendirme alanları bölümüne 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'sı, kullanıcıların telefon numaralarıyla oturum açması için iki ayrı yöntem sunar. Yerel (ör.Android ve iOS) platformlar, telefon numarası doğrulama konusunda 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, kullanıcının telefon numarası önce doğrulanmalı, ardından kullanıcı oturum açabilir veya hesabını PhoneAuthCredential ile bağlayabilir.

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

  1. verificationCompleted: Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
  2. verificationFailed: Geçersiz telefon numaraları veya SMS kotasının aşılıp aşılmadığı gibi hata etkinliklerini işleyin.
  3. codeSent: Firebase'den cihaza bir kod gönderildiğinde kullanıcıları kodu girmeye yönlendirmek için kullanılan işleyici.
  4. codeAutoRetrievalTimeout: Otomatik SMS kodu işleme başarısız olduğunda zaman aşımını işleyin.

verificationCompleted

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 girmesini gerektirmeden SMS kodunu otomatik olarak doğrular. Bu etkinlik gerçekleşirse kullanıcıların oturum açmak veya telefon numaralarını bağlamak için kullanabileceği 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);
  },
);

verificationFailed

Firebase, örneğin yanlış telefon numarası veya projenin SMS kotası aşıldığı için bir hata döndürürse bu işleyiciye FirebaseAuthException gönderilir. Bu durumda, hata koduna bağlı olarak kullanıcınıza bir sorun oluştuğunu 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
  },
);

codeSent

Firebase cihaza bir SMS kodu gönderdiğinde bu işleyici verificationId ve resendToken ile tetiklenir (resendToken yalnızca Android cihazlarda desteklenir, iOS cihazlar her zaman null değerini döndürür).

Bu etkinlik tetiklendikten sonra, uygulamanızın kullanıcı arayüzünü güncelleyerek kullanıcıdan beklediği SMS kodunu girmesini istemeniz iyi olur. 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, kısa süre önce gönderilmişse varsayılan olarak yeni bir SMS mesajı yeniden göndermez. Ancak, verifyPhoneNumber yöntemini forceResendingToken bağımsız değişkenine yeniden gönderme jetonuyla tekrar çağırarak bu davranışı geçersiz kılabilirsiniz. İşlem başarılı olursa SMS mesajı yeniden gönderilir.

codeAutoRetrievalTimeout

Otomatik SMS kodu çözümlemeyi destekleyen Android cihazlarda, cihaz belirli bir süre içinde SMS mesajını otomatik olarak çözemezse bu işleyici çağrılır. Süre dolduktan sonra cihaz, gelen iletileri çözmeye çalışmaz.

Cihaz varsayılan olarak 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, belirtilen telefon numarasına gönderilen SMS kodunu girerek telefona erişebildiklerini onaylayıp oturum açabilir. Daha fazla güvenlik ve spam önleme için kullanıcılardan Google reCAPTCHA widget'ını tamamlayarak insan olduklarını kanıtlamaları istenir. Onaylandıktan sonra SMS kodu gönderilir.

Flutter için Firebase Authentication SDK'sı, reCAPTCHA widget'ını varsayılan olarak kullanıma hazır şekilde 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 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 widget'ının görüntülenmesini tetikler. SMS kodu gönderilmeden önce kullanıcının testi tamamlaması gerekir. İşlem tamamlandıktan sonra, çözümlenen ConfirmationResult yanıtındaki confirm yöntemine SMS kodunu 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ızda abone olduğunuz tüm kimlik doğrulama durumu dinleyicilerini tetikler.

reCAPTCHA Yapılandırması

reCAPTCHA widget'ı, web uygulamanıza güvenlik sağlayan, tümüyle yönetilen bir akıştır.

signInWithPhoneNumber işlevinin 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" bir widget, uygulamanızın üzerinde tam sayfa modal olarak görünür.

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 hata oluşur. 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,
));

İsteğe bağlı olarak, 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ığı, reCAPTCHA'nın süresinin dolup dolmadığı veya bir hata oluşup oluşmadığı gibi etkinlikleri de dinleyebilirsiniz:

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

Test

Firebase, telefon numaralarının yerel olarak test edilmesini destekler:

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

verifyPhoneNumber veya signInWithPhoneNumber yöntemlerinden birine test telefon numarası sağlarsanız SMS gönderilmez. Bunun yerine, test kodunu doğrudan PhoneAuthProvider'a veya signInWithPhoneNumber'ın onay sonucu işleyicisiyle birlikte sağlayabilirsiniz.