Telefon Kimlik Doğrulaması

Telefonla kimlik doğrulama, kullanıcıların telefonlarını kimlik doğrulayıcı olarak 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'de oturum açabilir.

Son kullanıcıların kimlik doğrulama 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 amacıyla Google tarafından gönderilecek ve saklanacaktır. Geliştiriciler, Firebase Authentication telefon numarasıyla oturum açma hizmetini kullanmadan önce uygun son kullanıcı iznine sahip olduklarından emin olmalıdır.authentication

Firebase Telefon Kimlik Doğrulaması tüm ülkelerde desteklenmez. Daha fazla bilgi için lütfen SSS'lerine bakın.

Kurmak

Telefon Kimlik Doğrulamasına başlamadan önce şu adımları izlediğinizden emin olun:

  1. Firebase konsolunda Oturum Açma yöntemi olarak Telefonu 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 karma değerini bulma hakkında bilgi için İstemcinizin Kimlik Doğrulamasını Yapma konusuna bakın.
  3. iOS : Xcode'da projeniz için anında bildirimleri etkinleştirin ve APN 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ı da etkinleştirmeniz gerekir. Bu adımın ayrıntılı açıklamasını görüntülemek için Firebase iOS Phone Auth belgelerine bakın.
  4. Web : Uygulama alan adınızı Firebase konsolunda OAuth yönlendirme alan adları altına 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 emülatörlerinde test etmek için lütfen Test Etme bölümüne bakın.

Kullanım

Flutter için Firebase Authentication SDK'sı, bir kullanıcının telefon numarasıyla oturum açması için iki ayrı yol sunar. Yerel (örn. Android ve iOS) platformlar, bir telefon numarasını doğrulamak için web'den farklı işlevsellik sağlar, bu nedenle her platform için özel olarak iki yöntem mevcuttur:

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

Yerel: verifyPhoneNumber

Yerel platformlarda, öncelikle kullanıcının telefon numarasının doğrulanması gerekir ve 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) {},
);

İşlemeniz gereken 4 ayrı geri arama vardır ve her biri uygulama kullanıcı arayüzünü nasıl güncelleyeceğinizi belirleyecektir:

  1. doğrulama Tamamlandı : Android cihazlarda SMS kodunun otomatik olarak işlenmesi.
  2. doğrulamaFailed : Geçersiz telefon numaraları veya SMS kotasının aşılıp aşılmadığı gibi hata olaylarını yönetin.
  3. codeSent : Firebase'den cihaza bir kod gönderildiğinde, kullanıcılardan kodu girmelerini istemek için kullanılır.
  4. codeAutoRetrievalTimeout : Otomatik SMS kodu işleme başarısız olduğunda zaman aşımını yönetin.

doğrulamaTamamlandı

Bu işleyici yalnızca otomatik SMS kodu çözümlemesini destekleyen Android cihazlarda çağrılacaktı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, oturum açmak veya kullanıcının telefon numarasına bağlanmak 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ı nedeniyle bir hata döndürürse veya projenin SMS kotası aşılırsa bu işleyiciye bir FirebaseAuthException gönderilecektir. Bu durumda, hata koduna bağlı olarak kullanıcınıza bir şeylerin ters gittiğini 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
  },
);

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 bir değer döndürür).

Tetiklendikten sonra, kullanıcıdan beklediği SMS kodunu girmesini isteyecek şekilde uygulama kullanıcı arayüzünüzü güncellemeniz 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);
  },
);

Firebase, yakın zamanda gönderilmiş olan yeni bir SMS mesajını varsayılan olarak yeniden göndermez. Ancak, forceResendingToken bağımsız değişkenine yeniden gönderme belirteciyle verifyPhoneNumber yöntemini yeniden çağırarak bu davranışı geçersiz kılabilirsiniz. Başarılı olursa SMS mesajı yeniden gönderilecektir.

codeAutoRetrievalTimeout

Otomatik SMS kod çözümlemesini destekleyen Android cihazlarda, cihazın bir SMS mesajını belirli bir zaman dilimi içinde otomatik olarak çözmemesi durumunda bu işleyici çağrılacaktır. Zaman aralığı geçtikten sonra cihaz artık gelen mesajları çözümlemeye ç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 telefona erişimleri olduğunu onaylayarak oturum açabilirler. Daha fazla güvenlik ve spam önleme için kullanıcılardan bir Google reCAPTCHA widget'ını doldurarak 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 kutudan çıkar çıkmaz yönetir, ancak gerektiğinde 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ı ilk önce reCAPTCHA widget'ının görüntülenmesini tetikleyecektir. Kullanıcının SMS kodu gönderilmeden önce testi tamamlaması gerekir. 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ı gibi başarılı bir oturum açma, uygulamanız boyunca abone olduğunuz kimlik doğrulama durumu dinleyicilerini tetikleyecektir.

reCAPTCHA Yapılandırması

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

signInWithPhoneNumber ikinci argümanı, 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ünecektir.

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 bir hata atılır. Hiçbir container argümanı sağlanmazsa, widget "görünmez" olarak işlenecektir.

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

Yukarıda gösterildiği gibi size ve theme bağımsız değişkenlerini ö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 dolup dolmadığı veya bir hata atılıp atılmadığı 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ı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 telefon numaraları" açılır menüsüne tıklayın.
  2. Yeni bir telefon numarası (örn +44 7444 555666 ) ve test kodunu (örn. 123456 ) girin.

verifyPhoneNumber veya signInWithPhoneNumber yöntemlerine bir test telefon numarası sağlıyorsanız aslında hiçbir SMS gönderilmez. Bunun yerine test kodunu doğrudan PhoneAuthProvider veya signInWithPhoneNumber onay sonucu işleyicisini kullanarak sağlayabilirsiniz.