अपने Flutter ऐप्लिकेशन में बहु-स्तरीय पुष्टि (MFA) जोड़ें

अगर आपने Identity Platform के साथ Firebase Authentication में अपग्रेड किया है, तो अपने Flutter ऐप्लिकेशन में, मैसेज के ज़रिए कई चरणों में पुष्टि करने की सुविधा जोड़ी जा सकती है.

कई चरणों में पुष्टि करने की सुविधा (MFA) से, आपके ऐप्लिकेशन की सुरक्षा बढ़ जाती है. अक्सर, हमलावर पासवर्ड और सोशल मीडिया खातों को हैक कर लेते हैं. हालांकि, मैसेज को इंटरसेप्ट करना ज़्यादा मुश्किल होता है.

शुरू करने से पहले

  1. कम से कम एक ऐसा प्रोवाइडर चालू करें जो कई चरणों में पुष्टि करने की सुविधा के साथ काम करता हो. हर प्रोवाइडर, कई चरणों में पुष्टि करने की सुविधा के साथ काम करता है. हालांकि , फ़ोन से पुष्टि करने की सुविधा, गुमनाम तरीके से पुष्टि करने की सुविधा, और Apple Game Center के साथ काम नहीं करता.

  2. पक्का करें कि आपका ऐप्लिकेशन, उपयोगकर्ताओं के ईमेल पतों की पुष्टि कर रहा हो. कई चरणों में पुष्टि करने की सुविधा के लिए, ईमेल पते की पुष्टि करना ज़रूरी है. इससे, गलत इरादे वाले लोग ऐसे ईमेल पते से किसी सेवा के लिए रजिस्टर नहीं कर पाते जो उनका नहीं है. इसके बाद, वे पुष्टि करने का दूसरा चरण जोड़कर, असली मालिक को उसके खाते से बाहर कर देते हैं.

कई चरणों में पुष्टि करने की सुविधा चालू करना

  1. Firebase console में, सुरक्षा > पुष्टि पर जाएं.

  2. साइन-इन करने का तरीका टैब में, बेहतर सेक्शन में जाकर, मैसेज के ज़रिए कई चरणों में पुष्टि करने की सुविधा चालू करें.

    आपको वे फ़ोन नंबर भी डालने चाहिए जिनसे अपने ऐप्लिकेशन की जांच की जाएगी. टेस्ट फ़ोन नंबर रजिस्टर करना ज़रूरी नहीं है. हालांकि, डेवलपमेंट के दौरान थ्रॉटलिंग से बचने के लिए, हम ऐसा करने का सुझाव देते हैं.

  3. अगर आपने अब तक अपने ऐप्लिकेशन के डोमेन को अनुमति नहीं दी है, तो यह काम करें:

    1. Firebase console में, सुरक्षा > पुष्टि > सेटिंग टैब पर जाएं.

    2. अनुमति वाले डोमेन सेक्शन में, डोमेन जोड़ें पर क्लिक करें. इसके बाद, अपना डोमेन जोड़ें .

एनरॉलमेंट पैटर्न चुनना

आपके पास यह चुनने का विकल्प होता है कि आपके ऐप्लिकेशन के लिए, कई चरणों में पुष्टि करने की सुविधा ज़रूरी है या नहीं. साथ ही, यह भी तय किया जा सकता है कि उपयोगकर्ताओं को कब और कैसे रजिस्टर करें. कुछ सामान्य पैटर्न यहां दिए गए हैं:

  • रजिस्ट्रेशन के दौरान, उपयोगकर्ता के दूसरे चरण की जानकारी एनरॉल करें. अगर आपके ऐप्लिकेशन के लिए, सभी उपयोगकर्ताओं के लिए कई चरणों में पुष्टि करने की सुविधा ज़रूरी है, तो इस तरीके का इस्तेमाल करें.

  • रजिस्ट्रेशन के दौरान, दूसरे चरण की जानकारी रजिस्टर करने के लिए, स्किप किया जा सकने वाला विकल्प दें. जिन ऐप्लिकेशन के लिए, कई चरणों में पुष्टि करने की सुविधा ज़रूरी नहीं है, लेकिन वे लोगों को इस सुविधा का इस्तेमाल करने के लिए बढ़ावा देना चाहते हैं उनके लिए यह तरीका बेहतर हो सकता है.

  • साइन अप स्क्रीन के बजाय, उपयोगकर्ता के खाते या प्रोफ़ाइल मैनेजमेंट पेज से, दूसरा चरण जोड़ने की सुविधा दें. इससे रजिस्ट्रेशन की प्रोसेस में होने वाली मुश्किलों को कम किया जा सकता है. साथ ही, सुरक्षा को लेकर संवेदनशील उपयोगकर्ताओं के लिए, कई चरणों में पुष्टि करने की सुविधा उपलब्ध कराई जा सकती है.

  • जब उपयोगकर्ता, सुरक्षा से जुड़ी ज़्यादा ज़रूरी शर्तों वाली सुविधाओं को ऐक्सेस करना चाहे, तो उसे दूसरा चरण जोड़ने के लिए कहें.

दूसरा चरण एनरॉल करना

किसी उपयोगकर्ता के लिए, पुष्टि करने का नया दूसरा चरण रजिस्टर करने के लिए:

  1. उपयोगकर्ता की फिर से पुष्टि करें.

  2. उपयोगकर्ता से उसका फ़ोन नंबर डालने के लिए कहें.

  3. उपयोगकर्ता के लिए, कई चरणों में पुष्टि करने का सेशन पाएं:

    final multiFactorSession = await user.multiFactor.getSession();
    
  4. कई चरणों में पुष्टि करने के सेशन और अपने कॉलबैक की मदद से, फ़ोन नंबर की पुष्टि करें:

    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. मैसेज के ज़रिए कोड भेजने के बाद, उपयोगकर्ता से कोड की पुष्टि करने के लिए कहें:

    final credential = PhoneAuthProvider.credential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    
  6. एनरॉलमेंट की प्रोसेस पूरी करें:

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

नीचे दिया गया कोड, दूसरा चरण एनरॉल करने का पूरा उदाहरण दिखाता है:

  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/main/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: (_) {},
  );

बधाई हो! आपने किसी उपयोगकर्ता के लिए, पुष्टि करने का दूसरा चरण रजिस्टर कर लिया है.

पुष्टि करने के दूसरे चरण की मदद से, उपयोगकर्ताओं को साइन इन कराना

मैसेज के ज़रिए दो चरणों में पुष्टि करने की सुविधा की मदद से, किसी उपयोगकर्ता को साइन इन कराने के लिए:

  1. उपयोगकर्ता को पहले चरण की मदद से साइन इन कराएं. इसके बाद, FirebaseAuthMultiFactorException अपवाद को पकड़ें. इस गड़बड़ी में एक रिज़ॉल्वर होता है. इसका इस्तेमाल करके, उपयोगकर्ता के एनरॉल किए गए दूसरे चरण की जानकारी हासिल की जा सकती है. इसमें एक ऐसा सेशन भी शामिल होता है जिससे यह साबित होता है कि उपयोगकर्ता ने पहले चरण की मदद से पुष्टि कर ली है.

    उदाहरण के लिए, अगर उपयोगकर्ता का पहला चरण, ईमेल और पासवर्ड था, तो:

    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. अगर उपयोगकर्ता ने पुष्टि करने के एक से ज़्यादा दूसरे चरण एनरॉल किए हैं, तो उससे पूछें कि उसे कौनसे चरण का इस्तेमाल करना है:

    final session = e.resolver.session;
    
    final hint = e.resolver.hints[selectedHint];
    
  3. उपयोगकर्ता के फ़ोन पर, हिंट और कई चरणों में पुष्टि करने के सेशन के साथ, पुष्टि करने का मैसेज भेजें:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: session,
      multiFactorInfo: hint,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    
  4. पुष्टि करने के दूसरे चरण की प्रोसेस पूरी करने के लिए, resolver.resolveSignIn() को कॉल करें:

    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);
      }
    }
    

नीचे दिया गया कोड, कई चरणों में पुष्टि करने की सुविधा का इस्तेमाल करने वाले उपयोगकर्ता को साइन इन कराने का पूरा उदाहरण दिखाता है:

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/main/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) {
  ...
}

बधाई हो! आपने कई चरणों में पुष्टि करने की सुविधा का इस्तेमाल करके, किसी उपयोगकर्ता को साइन इन करा लिया है.

आगे क्या करना है