अपने फ़्लटर ऐप में बहु-कारक प्रमाणीकरण जोड़ें

यदि आपने आइडेंटिटी प्लेटफ़ॉर्म के साथ फायरबेस प्रमाणीकरण में अपग्रेड किया है, तो आप अपने फ़्लटर ऐप में एसएमएस मल्टी-फैक्टर प्रमाणीकरण जोड़ सकते हैं।

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

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

  1. कम से कम एक प्रदाता को सक्षम करें जो बहु-कारक प्रमाणीकरण का समर्थन करता हो। फ़ोन प्रमाणीकरण, अनाम प्रमाणीकरण और ऐप्पल गेम सेंटर को छोड़कर , प्रत्येक प्रदाता एमएफए का समर्थन करता है।

  2. सुनिश्चित करें कि आपका ऐप उपयोगकर्ता ईमेल सत्यापित कर रहा है। एमएफए को ईमेल सत्यापन की आवश्यकता है। यह दुर्भावनापूर्ण अभिनेताओं को किसी ऐसे ईमेल के साथ सेवा के लिए पंजीकरण करने से रोकता है जो उनके पास नहीं है, और फिर एक दूसरा कारक जोड़कर वास्तविक मालिक को लॉक कर देता है।

  3. एंड्रॉइड : यदि आपने फायरबेस कंसोल में अपने ऐप का SHA-256 हैश पहले से सेट नहीं किया है, तो ऐसा करें। अपने ऐप के SHA-256 हैश को ढूंढने के बारे में जानकारी के लिए अपने क्लाइंट को प्रमाणित करना देखें।

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

  5. वेब : सुनिश्चित करें कि आपने अपने एप्लिकेशन डोमेन को OAuth रीडायरेक्ट डोमेन के अंतर्गत फायरबेस कंसोल पर जोड़ा है।

बहु-कारक प्रमाणीकरण सक्षम करना

  1. फायरबेस कंसोल का प्रमाणीकरण > साइन-इन विधि पृष्ठ खोलें।

  2. उन्नत अनुभाग में, एसएमएस मल्टी-फैक्टर प्रमाणीकरण सक्षम करें।

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

  3. यदि आपने पहले से ही अपने ऐप के डोमेन को अधिकृत नहीं किया है, तो इसे फायरबेस कंसोल के प्रमाणीकरण> सेटिंग्स पृष्ठ पर अनुमति सूची में जोड़ें।

नामांकन पैटर्न चुनना

आप चुन सकते हैं कि आपके ऐप को बहु-कारक प्रमाणीकरण की आवश्यकता है या नहीं, और अपने उपयोगकर्ताओं को कैसे और कब नामांकित करना है। कुछ सामान्य पैटर्न में शामिल हैं:

  • पंजीकरण के भाग के रूप में उपयोगकर्ता के दूसरे कारक को नामांकित करें। यदि आपके ऐप को सभी उपयोगकर्ताओं के लिए बहु-कारक प्रमाणीकरण की आवश्यकता है तो इस विधि का उपयोग करें।

  • पंजीकरण के दौरान दूसरे कारक को नामांकित करने के लिए एक स्किप करने योग्य विकल्प प्रदान करें। ऐसे ऐप्स जो बहु-कारक प्रमाणीकरण को प्रोत्साहित करना चाहते हैं, लेकिन इसकी आवश्यकता नहीं है, वे इस दृष्टिकोण को पसंद कर सकते हैं।

  • साइन अप स्क्रीन के बजाय उपयोगकर्ता के खाते या प्रोफ़ाइल प्रबंधन पृष्ठ से दूसरा कारक जोड़ने की क्षमता प्रदान करें। यह पंजीकरण प्रक्रिया के दौरान घर्षण को कम करता है, साथ ही सुरक्षा-संवेदनशील उपयोगकर्ताओं के लिए बहु-कारक प्रमाणीकरण भी उपलब्ध कराता है।

  • जब उपयोगकर्ता बढ़ी हुई सुरक्षा आवश्यकताओं के साथ सुविधाओं का उपयोग करना चाहता है तो उसे क्रमिक रूप से एक दूसरा कारक जोड़ने की आवश्यकता होती है।

दूसरे कारक का नामांकन

किसी उपयोगकर्ता के लिए एक नया द्वितीयक कारक नामांकित करने के लिए:

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

बधाई हो! आपने एक उपयोगकर्ता के लिए दूसरा प्रमाणीकरण कारक सफलतापूर्वक पंजीकृत किया है।

उपयोगकर्ताओं को दूसरे कारक से साइन इन करना

किसी उपयोगकर्ता को दो-कारक एसएमएस सत्यापन के साथ साइन इन करने के लिए:

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

बधाई हो! आपने बहु-कारक प्रमाणीकरण का उपयोग करके किसी उपयोगकर्ता में सफलतापूर्वक साइन इन किया है।

आगे क्या होगा