अगर आपने Identity Platform की मदद से Firebase Authentication पर अपग्रेड किया है, तो अपने Flutter ऐप्लिकेशन में एसएमएस से कई तरीकों से पुष्टि करने की सुविधा जोड़ी जा सकती है.
कई तरीकों से पुष्टि करने की सुविधा (MFA) से, आपके ऐप्लिकेशन की सुरक्षा बढ़ती है. हमलावर अक्सर पासवर्ड और सोशल मीडिया खातों को हैक कर लेते हैं. हालांकि, टेक्स्ट मैसेज को इंटरसेप्ट करना ज़्यादा मुश्किल होता है.
शुरू करने से पहले
कई चरणों में पुष्टि करने की सुविधा देने वाली कम से कम एक सेवा चालू करें. हर सेवा देने वाली कंपनी, एमएफ़ए की सुविधा देती है. हालांकि, फ़ोन से पुष्टि करने, बिना पहचान ज़ाहिर किए पुष्टि करने, और Apple Game Center को छोड़कर बाकी सभी सेवाएं देने वाली कंपनियां एमएफ़ए की सुविधा नहीं देती हैं.
पक्का करें कि आपका ऐप्लिकेशन, उपयोगकर्ता के ईमेल पतों की पुष्टि कर रहा हो. एमएफ़ए के लिए, ईमेल पते की पुष्टि करना ज़रूरी है. इससे नुकसान पहुंचाने वाले लोग, किसी ऐसी सेवा के लिए रजिस्टर नहीं कर पाते जिसका ईमेल पता उनके पास नहीं है. साथ ही, दूसरे फ़ैक्टर जोड़कर, असली मालिक को लॉक आउट नहीं कर पाते.
Android: अगर आपने अब तक Firebase कंसोल में अपने ऐप्लिकेशन का SHA-256 हैश सेट नहीं किया है, तो ऐसा करें. अपने ऐप्लिकेशन का SHA-256 हैश ढूंढने के बारे में जानने के लिए, अपने क्लाइंट की पुष्टि करना देखें.
iOS: Xcode में, अपने प्रोजेक्ट के लिए पुश नोटिफ़िकेशन चालू करें. साथ ही, पक्का करें कि आपकी APNs पुष्टि करने वाली कुंजी, Firebase क्लाउड से मैसेज (FCM) के साथ कॉन्फ़िगर की गई हो. इसके अलावा, रिमोट सूचनाएं पाने के लिए, आपको बैकग्राउंड मोड चालू करने होंगे. इस चरण के बारे में ज़्यादा जानकारी के लिए, Firebase iOS फ़ोन ऑथेंटिकेशन दस्तावेज़ देखें.
वेब: पक्का करें कि आपने Firebase कंसोल में, OAuth रीडायरेक्ट डोमेन में जाकर, अपने ऐप्लिकेशन का डोमेन जोड़ा हो.
कई चरणों में पुष्टि करने की सुविधा चालू करना
Firebase कंसोल का पुष्टि करना > साइन इन करने का तरीका पेज खोलें.
बेहतर सेक्शन में, एसएमएस से कई तरीकों से पुष्टि करने की सुविधा चालू करें.
आपको वे फ़ोन नंबर भी डालने चाहिए जिनसे आपको अपने ऐप्लिकेशन की जांच करनी है. टेस्ट फ़ोन नंबर रजिस्टर करना ज़रूरी नहीं है. हालांकि, डेवलपमेंट के दौरान ट्रैफ़िक को कम करने से बचने के लिए, ऐसा करने का सुझाव दिया जाता है.
अगर आपने अपने ऐप्लिकेशन के डोमेन को अनुमति नहीं दी है, तो उसे Firebase कंसोल के पुष्टि करना > सेटिंग पेज पर, अनुमति वाली सूची में जोड़ें.
रजिस्टर करने का पैटर्न चुनना
आपके पास यह चुनने का विकल्प होता है कि आपके ऐप्लिकेशन के लिए, कई तरीकों से पुष्टि करने की ज़रूरत है या नहीं. साथ ही, यह भी चुना जा सकता है कि उपयोगकर्ताओं को कब और कैसे रजिस्टर किया जाए. कुछ सामान्य पैटर्न में ये शामिल हैं:
रजिस्ट्रेशन के दौरान, उपयोगकर्ता के दूसरे फ़ैक्टर को रजिस्टर करें. अगर आपके ऐप्लिकेशन में सभी उपयोगकर्ताओं के लिए, कई तरीकों से पुष्टि करने की ज़रूरत है, तो इस तरीके का इस्तेमाल करें.
रजिस्ट्रेशन के दौरान, दो तरीकों से पुष्टि करने की सुविधा को शामिल करने का विकल्प दें. हालांकि, उपयोगकर्ता इस विकल्प को स्किप कर सकते हैं. ऐसे ऐप्लिकेशन जो कई तरीकों से पुष्टि करने की सुविधा का इस्तेमाल करने के लिए लोगों को बढ़ावा देना चाहते हैं, लेकिन इसे ज़रूरी नहीं बनाना चाहते, वे इस तरीके को अपना सकते हैं.
साइन अप स्क्रीन के बजाय, उपयोगकर्ता के खाते या प्रोफ़ाइल मैनेजमेंट पेज से दूसरा फ़ैक्टर जोड़ने की सुविधा दें. इससे रजिस्ट्रेशन की प्रोसेस के दौरान होने वाली परेशानी कम हो जाती है. साथ ही, सुरक्षा को लेकर संवेदनशील उपयोगकर्ताओं के लिए, कई तरीकों से पुष्टि करने की सुविधा उपलब्ध रहती है.
जब उपयोगकर्ता ज़्यादा सुरक्षा की ज़रूरी शर्तों के साथ सुविधाओं को ऐक्सेस करना चाहता है, तो उसे धीरे-धीरे दूसरा फ़ैक्टर जोड़ना पड़ता है.
पुष्टि करने का दूसरा चरण रजिस्टर करना
किसी उपयोगकर्ता के लिए नया सेकंडरी फ़ैक्टर रजिस्टर करने के लिए:
उपयोगकर्ता की फिर से पुष्टि करें.
उपयोगकर्ता से उसका फ़ोन नंबर डालने के लिए कहें.
उपयोगकर्ता के लिए, कई तरीकों से पुष्टि करने वाला सेशन पाएं:
final multiFactorSession = await user.multiFactor.getSession();
मल्टी फ़ैक्टर सेशन और कॉलबैक की मदद से, फ़ोन नंबर की पुष्टि करें:
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: (_) {}, );
एसएमएस कोड भेजने के बाद, उपयोगकर्ता से कोड की पुष्टि करने के लिए कहें:
final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, );
रजिस्ट्रेशन की प्रक्रिया पूरी करें:
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: (_) {},
);
बधाई हो! आपने किसी उपयोगकर्ता के लिए, पुष्टि करने का दूसरा तरीका रजिस्टर कर लिया है.
उपयोगकर्ताओं को दूसरे तरीके से साइन इन कराना
एसएमएस से दो तरीकों से पुष्टि करने की सुविधा की मदद से, किसी उपयोगकर्ता को साइन इन करने के लिए:
उपयोगकर्ता को पहले फ़ैक्टर से साइन इन कराएं. इसके बाद,
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 // ... }
अगर उपयोगकर्ता ने एक से ज़्यादा सेकंडरी फ़ैक्टर रजिस्टर किए हैं, तो उससे पूछें कि किसका इस्तेमाल करना है:
final session = e.resolver.session; final hint = e.resolver.hints[selectedHint];
उपयोगकर्ता के फ़ोन पर पुष्टि करने वाला मैसेज भेजें. इसमें, उपयोगकर्ता को दिए गए हिंट और कई फ़ैक्टर वाले सेशन की जानकारी शामिल होनी चाहिए:
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: session, multiFactorInfo: hint, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // ... }, codeAutoRetrievalTimeout: (_) {}, );
दूसरी बार पुष्टि करने के लिए,
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) {
...
}
बधाई हो! आपने कई तरीकों से पुष्टि करने की सुविधा का इस्तेमाल करके, किसी उपयोगकर्ता को साइन इन कर दिया है.
आगे क्या करना है
- एडमिन SDK की मदद से, प्रोग्राम के हिसाब से मल्टी-फ़ैक्टर उपयोगकर्ताओं को मैनेज करें.