Flutter uygulamanıza çok öğeli kimlik doğrulaması ekleme

Identity Platform ile Firebase Authentication'a yükselttiyseniz Flutter uygulamanıza SMS ile çok öğeli kimlik doğrulaması ekleyebilirsiniz.

Çok öğeli kimlik doğrulaması (MFA), uygulamanızın güvenliğini artırır. Saldırganlar şifrelerin ve sosyal hesapların güvenliğini ihlal etmekte, kısa mesajlara müdahale etmek daha zor olabilir.

Başlamadan önce

  1. Çok öğeli kimlik doğrulamasını destekleyen en az bir sağlayıcıyı etkinleştirin. Telefon kimlik doğrulaması, anonim kimlik doğrulama ve Apple Game Center.

  2. Uygulamanızın kullanıcı e-postalarını doğruladığından emin olun. MFA için e-posta doğrulaması gerekir. Bu işlem, kötü niyetli kişilerin e-posta ile bir hizmete kaydolmasını engeller gerçek sahibini kilitlemez ve ikinci bir giriş ekleyerek faktörünü içerir.

  3. Android: Uygulamanızın SHA-256 karmasını Firebase konsolunda yapılandırın. İstemcinizin Kimliğini Doğrulama bölümünü inceleyin inceleyin.

  4. iOS: Xcode'da projeniz için push bildirimlerini etkinleştirin ve sağlamak APNs kimlik doğrulama anahtarınız Firebase Cloud Messaging (FCM) ile yapılandırılır. Ayrıca, uzaktan bildirimler için arka plan modlarını etkinleştirin. Bu adımla ilgili ayrıntılı açıklamayı görüntülemek için Firebase iOS Phone Auth dokümanlarına bakın.

  5. Web: Uygulama alan adınızı Firebase konsolunda, OAuth yönlendirme alan adları.

Çok öğeli kimlik doğrulamasını etkinleştirme

  1. Kimlik Doğrulama > Oturum açma yöntemi sayfasındaki talimatları uygulayın.

  2. Gelişmiş bölümünde, SMS Çok Öğeli Kimlik Doğrulaması'nı etkinleştirin.

    Ayrıca uygulamanızı test edeceğiniz telefon numaralarını da girmeniz gerekir. İsteğe bağlı olsa da, test amaçlı telefon numaralarının Kısıtlamadan kaçının.

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

Kayıt kalıbı seçme

Uygulamanızın çok öğeli kimlik doğrulaması gerektirip gerektirmediğini ve ve kullanıcılarınızı ne zaman kaydetmeniz gerektiği. Bazı yaygın kalıplar şunlardır:

  • Kullanıcının ikinci faktörünü kayıt işleminin bir parçası olarak kaydedin. Bunu kullan yöntemini kullanın.

  • Kayıt sırasında ikinci bir faktör kaydettirmek için atlanabilir bir seçenek sunun. Uygulamalar çok öğeli kimlik doğrulamasını teşvik etmek isteyen ancak zorunlu olmayan tercih ediyor olabilir.

  • Kullanıcının hesabından veya profilinden ikinci bir faktör ekleme olanağı sağlama izleme sayfası görüntülenir. Böylece, proje yürütme aşamasında kayıt sürecinde, çok öğeli kimlik doğrulamasını güvenlik açısından hassas kullanıcılar tarafından kullanılabilir.

  • Kullanıcı erişim istediğinde ikinci bir faktör eklemeyi zorunlu kıl yeni özelliklerden yararlanabilirsiniz.

İkinci faktör kaydettirme

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

  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 öğeli oturum alma:

    final multiFactorSession = await user.multiFactor.getSession();
    
  4. Telefon numarasını çok faktörlü oturumla ve geri arama özelliğiyle 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 kodda, ikinci bir faktör kaydetmeyle ilgili tam bir örnek gösterilmektedir:

  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! için ikinci bir kimlik doğrulama faktörünü başarıyla kaydettiniz daha ayrıntılı şekilde ele alınmıştır.

İkinci faktörle kullanıcıların oturum açmasını sağlama

İki faktörlü SMS doğrulamasıyla bir kullanıcının oturumunu açmak için:

  1. Kullanıcının ilk faktörünü kullanarak oturum açmasını sağlayın, ardından FirebaseAuthMultiFactorException istisna. Bu hata, çözümleyici bulunur. Bu kod, kullanıcının kayıtlı ikinci faktörlerini elde etmek için kullanılabilir. Ayrıca, kullanıcının başarılı bir şekilde çalıştığını kanıtlayan temel bir oturum da içerir. ilk faktörüyle doğrulanmıştır.

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

    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ı olduğu durumlarda hangisinin kayıtlı olduğunu sorun. kullanın:

    final session = e.resolver.session;
    
    final hint = e.resolver.hints[selectedHint];
    
  3. Kullanıcının telefonuna ipucu ile birlikte bir doğrulama iletisi gönderin çok öğeli oturum:

    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() numaralı telefonu arayı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 kodda, çok öğeli bir kullanıcının oturum açmasıyla ilgili tam bir örnek gösterilmektedir:

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 öğeli kimlik doğrulaması kullanarak bir kullanıcının oturumunu başarıyla açtınız kimlik doğrulama.

Sırada ne var?