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 (sağlanan telefon numarası kullanılarak) benzersiz bir kod içeren bir SMS mesajı gönderilir. Kod yetkilendirildikten sonra kullanıcı Firebase'e giriş yapabilir.

Son kullanıcıların kimlik doğrulaması için sağladığı telefon numaraları, Firebase dahil ancak bunlarla sınırlı olmamak üzere Google hizmetlerinde spam ve kötüye kullanım önleme sürecini iyileştirmek için Google tarafından gönderilir ve depolanır. Geliştiriciler, Firebase Authentication telefon numarası ile oturum açma hizmetini kullanmadan önce uygun son kullanıcı iznini almış olmalıdır.authentication

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

Kurulum

Telefonla kimlik doğrulamayı kullanmaya başlamadan önce aşağıdaki adımları uyguladığınızdan emin olun:

  1. Firebase konsolunda oturum açma yöntemi olarak Telefon'u etkinleştirin.
  2. Android: Uygulamanızın SHA-1 karmasını Firebase konsolunda 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 bildirimleri 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 Telefon Kimlik Doğrulaması belgelerini inceleyin.
  4. Web: Uygulamanızın alanını Firebase Konsolu'ndaki OAuth yönlendirme alanları bölümüne eklediğinizden emin olun.

Not: Telefon numarası ile 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 farklı yöntem sunar. Yerel (ör.Android ve iOS) platformlar, telefon numarasını 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

Yerleşik platformlarda, kullanıcının telefon numarası önce 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ı istemeniz gerekir. Bu bilgiler 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. 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şılması gibi hata etkinliklerini yönetin.
  3. codeSent: Firebase'den cihaza bir kod gönderildiğinde işlenir. Kullanıcılardan kodu girmelerini istemek için kullanılır.
  4. codeAutoRetrievalTimeout: Otomatik SMS kodu işlemenin başarısız olduğu durumlarda zaman aşımıyla ilgili işlemleri gerçekleştirir.

verificationCompleted

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

SMS kodu cihaza gönderildiğinde Android, kullanıcının kodu manuel olarak girmesini gerektirmeden SMS kodunu otomatik olarak doğrular. Bu etkinlik gerçekleşirse 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);
  },
);

verificationFailed

Firebase yanlış telefon numarası gibi bir hata döndürür veya projenin SMS kotası aşılırsa bu işleyiciye bir FirebaseAuthException gönderilir. Bu durumda, hata koduna bağlı olarak kullanıcınıza bir sorun olduğ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 SMS kodu gönderdiğinde bu işleyici bir verificationId ve resendToken ile tetiklenir (resendToken yalnızca Android cihazlarda desteklenir. iOS cihazlar her zaman bir null değeri döndürür).

Tetiklendikten sonra, kullanıcıdan beklediği SMS kodunu girmesini istemek için uygulama kullanıcı arayüzünüzü güncellemeniz iyi bir zaman olur. 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);
  },
);

Firebase, varsayılan olarak yeni bir SMS mesajı yakın zamanda gönderilmişse bu mesajı yeniden göndermez. Bununla birlikte, forceResendingToken bağımsız değişkenine yeniden gönderme jetonunu ekleyerek verifyPhoneNumber yöntemini yeniden çağırarak bu davranışı geçersiz kılabilirsiniz. İşlem başarılı olursa SMS mesajı yeniden gönderilir.

codeAutoRetrievalTimeout

Otomatik SMS kodu çözümünü destekleyen Android cihazlarda, cihaz belirli bir zaman aralığında SMS mesajını otomatik olarak çözmezse bu işleyici çağrılır. Zaman aralığı geçtiğinde 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, sağlanan telefon numarasına gönderilen SMS kodunu girerek bir telefona erişimi olduğunu onaylayarak oturum açabilir. Daha fazla güvenlik ve spam önleme için kullanıcılardan bir Google reCAPTCHA widget'ını doldurarak gerçek bir kullanıcı 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 olarak yönetir ancak gerekirse nasıl gösterileceği ve yapılandırılacağı üzerinde kontrol sağlar. Başlamak için signInWithPhoneNumber yöntemini telefon numarasıyla çağırı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öntem çağrıldığında ilk olarak reCAPTCHA widget'ının görüntülenmesi tetiklenir. 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 oturumunu açabilirsiniz:

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, 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ünür.

Ancak kullanıcının kendisini doğrulamak için açıkça basması gereken bir satır içi widget gösterilebilir.

Satır içi widget eklemek için RecaptchaVerifier örneğinin container bağımsız değişkenine bir DOM öğesi kimliği belirtin. Öğenin mevcut ve boş olması gerekir. 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 size ve theme bağımsız değişkenlerini yukarıda gösterildiği gibi özelleştirerek boyutu ve temayı değiştirebilirsiniz.

reCAPTCHA'nın kullanıcı tarafından tamamlanıp tamamlanmadığı, reCAPTCHA'nın süresinin dolup dolmadığı veya bir hata atlanıp atlanmadığı gibi etkinlikleri de dinleyebilirsiniz:

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

Test

Firebase, telefon numaralarını yerel olarak test etme desteği sunar:

  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öntemlerine test telefon numarası sağlanırsa SMS gönderilmez. Bunun yerine test kodunu doğrudan PhoneAuthProvider'e veya signInWithPhoneNumber'un onay sonucu işleyicisine sağlayabilirsiniz.