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

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

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

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

  1. कई चरणों में पुष्टि करने की सुविधा देने वाली कम से कम एक सेवा चालू करें. हर सेवा देने वाली कंपनी, एमएफ़ए की सुविधा देती है. हालांकि, फ़ोन से पुष्टि करने, पहचान छिपाकर पुष्टि करने, और Apple Game Center के लिए यह सुविधा उपलब्ध नहीं है.

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

    • iOS+: Xcode में, अपने प्रोजेक्ट के लिए पुश नोटिफ़िकेशन चालू करें और पक्का करें कि आपकी APNs पुष्टि करने वाली कुंजी, Firebase Cloud Messaging (FCM) के साथ कॉन्फ़िगर की गई हो.

      इसके अलावा, आपको रिमोट सूचनाओं के लिए, बैकग्राउंड मोड चालू करना होगा. ज़्यादा जानकारी के लिए, Firebase iOS Phone Auth का दस्तावेज़ देखें.

    • Android: अगर आपने अब तक अपने ऐप्लिकेशन का SHA-256 फ़िंगरप्रिंट नहीं दिया है, तो इसे दें:

      1. Firebase कंसोल में, सेटिंग > सामान्य टैब पर जाएं.

      2. नीचे की ओर स्क्रोल करके, आपके ऐप्लिकेशन कार्ड पर जाएं. इसके बाद, अपना Android ऐप्लिकेशन चुनें और SHA सर्टिफ़िकेट फ़िंगरप्रिंट फ़ील्ड में अपना SHA-256 फ़िंगरप्रिंट जोड़ें.

      अपने ऐप्लिकेशन के SHA फ़िंगरप्रिंट को पाने के तरीके के बारे में जानने के लिए, अपने क्लाइंट की पुष्टि करना लेख पढ़ें.

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

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

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

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

  1. Firebase console में, Security > Authentication पर जाएं.

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

बधाई हो! आपने मल्टी-फ़ैक्टर ऑथेंटिकेशन का इस्तेमाल करके, किसी उपयोगकर्ता के खाते में सफलतापूर्वक साइन इन किया हो.

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