Flutter uygulamanıza çok faktörlü kimlik doğrulama ekleyin

Identity Platform ile Firebase Authentication'a yükseltme yaptıysanız Flutter uygulamanıza SMS çok faktörlü kimlik doğrulaması ekleyebilirsiniz.

Çok faktörlü kimlik doğrulama (MFA), uygulamanızın güvenliğini artırır. Saldırganlar genellikle şifreleri ve sosyal hesapları ele geçirirken, bir kısa mesajı ele geçirmek daha zordur.

Sen başlamadan önce

  1. Çok faktörlü kimlik doğrulamayı destekleyen en az bir sağlayıcıyı etkinleştirin. Telefonla kimlik doğrulama, anonim kimlik doğrulama ve Apple Game Center dışında her sağlayıcı MFA'yı destekler.

  2. Uygulamanızın kullanıcı e-postalarını doğruladığından emin olun. MFA, e-posta doğrulaması gerektirir. Bu, kötü niyetli aktörlerin, sahip olmadıkları bir e-postayla bir hizmete kaydolmalarını ve ardından ikinci bir faktör ekleyerek gerçek sahibi kilitlemelerini önler.

  3. Android : Uygulamanızın SHA-256 karmasını Firebase konsolunda henüz ayarlamadıysanız bunu yapın. Uygulamanızın SHA-256 karma değerini bulma hakkında bilgi için İstemcinizin Kimlik Doğrulamasını Yapma konusuna bakın.

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

  5. Web : Uygulama alan adınızı Firebase konsolunda OAuth yönlendirme alan adları altına eklediğinizden emin olun.

Çok faktörlü kimlik doğrulamayı etkinleştirme

  1. Firebase konsolunun Kimlik Doğrulama > Oturum açma yöntemi sayfasını açın.

  2. Gelişmiş bölümünde SMS Çok Faktörlü Kimlik Doğrulamayı etkinleştirin.

    Ayrıca uygulamanızı test edeceğiniz telefon numaralarını da girmelisiniz. İsteğe bağlı olmakla birlikte, geliştirme sırasında kısıtlamayı önlemek için test telefon numaralarının kaydedilmesi önemle tavsiye edilir.

  3. Uygulamanızın alan adını henüz yetkilendirmediyseniz Firebase konsolunun Kimlik Doğrulama > Ayarlar sayfasındaki izin verilenler listesine ekleyin.

Bir kayıt düzeni seçme

Uygulamanızın çok faktörlü kimlik doğrulama gerektirip gerektirmediğini ve kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Bazı yaygın kalıplar şunları içerir:

  • Kullanıcının ikinci faktörünü kaydın bir parçası olarak kaydedin. Uygulamanız tüm kullanıcılar için çok faktörlü kimlik doğrulama gerektiriyorsa bu yöntemi kullanın.

  • Kayıt sırasında ikinci bir faktörün kaydedilmesi için atlanabilir bir seçenek sunun. Çok faktörlü kimlik doğrulamayı teşvik etmek isteyen ancak gerektirmeyen uygulamalar bu yaklaşımı tercih edebilir.

  • Kayıt ekranı yerine kullanıcının hesabından veya profil yönetimi sayfasından ikinci bir faktör ekleme olanağı sağlayın. Bu, kayıt işlemi sırasındaki anlaşmazlıkları en aza indirirken, aynı zamanda güvenlik konusunda hassas kullanıcılar için çok faktörlü kimlik doğrulamayı kullanılabilir hale getirir.

  • Kullanıcı artan güvenlik gereksinimlerine sahip özelliklere erişmek istediğinde ikinci bir faktörün aşamalı olarak eklenmesini zorunlu kılın.

İkinci bir faktörün kaydedilmesi

Bir kullanıcıya yeni bir ikincil faktör kaydetmek için:

  1. Kullanıcının kimliğini yeniden doğrulayın.

  2. Kullanıcıdan telefon numarasını girmesini isteyin.

  3. Kullanıcı için çok faktörlü bir oturum edinin:

    final multiFactorSession = await user.multiFactor.getSession();
    
  4. Telefon numarasını çok faktörlü bir oturumla ve geri aramalarınızla doğrulayın:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: multiFactorSession,
      phoneNumber: phoneNumber,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // The SMS verification code has been sent to the provided phone number.
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    ); 
    
  5. SMS kodu gönderildikten sonra kullanıcıdan kodu doğrulamasını isteyin:

    final credential = PhoneAuthProvider.credential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    
  6. Kaydı tamamlayın:

    await user.multiFactor.enroll(
      PhoneMultiFactorGenerator.getAssertion(
        credential,
      ),
    );
    

Aşağıdaki kod, ikinci bir faktörü kaydetmenin tam bir örneğini gösterir:

  final session = await user.multiFactor.getSession();
  final auth = FirebaseAuth.instance;
  await auth.verifyPhoneNumber(
    multiFactorSession: session,
    phoneNumber: phoneController.text,
    verificationCompleted: (_) {},
    verificationFailed: (_) {},
    codeSent: (String verificationId, int? resendToken) async {
      // See `firebase_auth` example app for a method of retrieving user's sms code: 
      // https://github.com/firebase/flutterfire/blob/master/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
      final smsCode = await getSmsCodeFromUser(context);

      if (smsCode != null) {
        // Create a PhoneAuthCredential with the code
        final credential = PhoneAuthProvider.credential(
          verificationId: verificationId,
          smsCode: smsCode,
        );

        try {
          await user.multiFactor.enroll(
            PhoneMultiFactorGenerator.getAssertion(
              credential,
            ),
          );
        } on FirebaseAuthException catch (e) {
          print(e.message);
        }
      }
    },
    codeAutoRetrievalTimeout: (_) {},
  );

Tebrikler! Bir kullanıcı için ikinci kimlik doğrulama faktörünü başarıyla kaydettiniz.

Kullanıcıların ikinci bir faktörle oturum açması

Bir kullanıcıda iki faktörlü SMS doğrulamayla oturum açmak için:

  1. Kullanıcının ilk faktörüyle oturum açın, ardından FirebaseAuthMultiFactorException istisnasını yakalayın. Bu hata, kullanıcının kayıtlı ikinci faktörlerini elde etmek için kullanabileceğiniz bir çözümleyici içerir. Ayrıca, kullanıcının ilk faktörüyle başarılı bir şekilde kimliğinin doğrulandığını kanıtlayan temel bir oturum da içerir.

    Örneğin, kullanıcının ilk faktörü e-posta ve şifre ise:

    try {
      await _auth.signInWithEmailAndPassword(
          email: emailController.text,
          password: passwordController.text,
      );
      // User is not enrolled with a second factor and is successfully
      // signed in.
      // ...
    } on FirebaseAuthMultiFactorException catch (e) {
      // The user is a multi-factor user. Second factor challenge is required
      final resolver = e.resolver
      // ...
    }
    
  2. Kullanıcının birden fazla ikincil faktörü kayıtlıysa hangisini kullanacağını sorun:

    final session = e.resolver.session;
    
    final hint = e.resolver.hints[selectedHint];
    
  3. İpucu ve çok faktörlü oturumu içeren kullanıcının telefonuna bir doğrulama mesajı gönderin:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: session,
      multiFactorInfo: hint,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    
  4. İkincil kimlik doğrulamayı tamamlamak için resolver.resolveSignIn() öğesini çağırın:

    final smsCode = await getSmsCodeFromUser(context);
    if (smsCode != null) {
      // Create a PhoneAuthCredential with the code
      final credential = PhoneAuthProvider.credential(
        verificationId: verificationId,
        smsCode: smsCode,
      );
    
      try {
        await e.resolver.resolveSignIn(
          PhoneMultiFactorGenerator.getAssertion(credential)
        );
      } on FirebaseAuthException catch (e) {
        print(e.message);
      }
    }
    

Aşağıdaki kod, çok faktörlü bir kullanıcıda oturum açmanın tam bir örneğini gösterir:

try {
  await _auth.signInWithEmailAndPassword(
    email: emailController.text,
    password: passwordController.text,
  );
} on FirebaseAuthMultiFactorException catch (e) {
  setState(() {
    error = '${e.message}';
  });
  final firstHint = e.resolver.hints.first;
  if (firstHint is! PhoneMultiFactorInfo) {
    return;
  }
  await FirebaseAuth.instance.verifyPhoneNumber(
    multiFactorSession: e.resolver.session,
    multiFactorInfo: firstHint,
    verificationCompleted: (_) {},
    verificationFailed: (_) {},
    codeSent: (String verificationId, int? resendToken) async {
      // See `firebase_auth` example app for a method of retrieving user's sms code: 
      // https://github.com/firebase/flutterfire/blob/master/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
      final smsCode = await getSmsCodeFromUser(context);

      if (smsCode != null) {
        // Create a PhoneAuthCredential with the code
        final credential = PhoneAuthProvider.credential(
          verificationId: verificationId,
          smsCode: smsCode,
        );

        try {
          await e.resolver.resolveSignIn(
            PhoneMultiFactorGenerator.getAssertion(
              credential,
            ),
          );
        } on FirebaseAuthException catch (e) {
          print(e.message);
        }
      }
    },
    codeAutoRetrievalTimeout: (_) {},
  );
} catch (e) {
  ...
} 

Tebrikler! Çok faktörlü kimlik doğrulamayı kullanarak bir kullanıcıda başarıyla oturum açtınız.

Sıradaki ne