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

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

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

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

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

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

  3. Android: अगर आपने Firebase कंसोल में अपने ऐप्लिकेशन का SHA-256 हैश सेट नहीं किया है, तो ऐसा करें. अपने ऐप्लिकेशन का SHA-256 हैश ढूंढने के बारे में जानकारी के लिए, अपने क्लाइंट की पुष्टि करना लेख पढ़ें.

  4. iOS: Xcode में, अपने प्रोजेक्ट के लिए पुश नोटिफ़िकेशन चालू करें. साथ ही, यह पक्का करें कि आपकी APNs पुष्टि करने वाली कुंजी, Firebase क्लाउड से मैसेज (FCM) के साथ कॉन्फ़िगर की गई हो. इसके अलावा, रिमोट सूचनाओं के लिए आपको बैकग्राउंड मोड चालू करने होंगे. इस चरण के बारे में ज़्यादा जानकारी के लिए, Firebase iOS Phone Auth का दस्तावेज़ देखें.

  5. वेब: पक्का करें कि आपने Firebase कंसोल पर, OAuth रीडायरेक्ट डोमेन में जाकर अपने ऐप्लिकेशन का डोमेन जोड़ा हो.

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

  1. Firebase कंसोल में, Authentication > साइन-इन करने का तरीका पेज खोलें.

  2. ऐडवांस सेक्शन में जाकर, एसएमएस के ज़रिए कई चरणों में पुष्टि करने की सुविधा चालू करें.

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

  3. अगर आपने पहले से ही अपने ऐप्लिकेशन के डोमेन को अनुमति नहीं दी है, तो Firebase कंसोल के Authentication > Settings पेज पर जाकर, उसे अनुमति वाली सूची में जोड़ें.

पंजीकरण का पैटर्न चुनना

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

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

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

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

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

पुष्टि करने का दूसरा तरीका रजिस्टर करना

किसी उपयोगकर्ता के लिए नया सेकंडरी फ़ैक्टर रजिस्टर करने के लिए:

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

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

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