Firebase से पुष्टि करने की सुविधा का इस्तेमाल करके, किसी उपयोगकर्ता को साइन इन करने के लिए, उसे एक लिंक वाला ईमेल भेजा जा सकता है. इस लिंक पर क्लिक करके, उपयोगकर्ता साइन इन कर सकता है. इस प्रोसेस में, उपयोगकर्ता के ईमेल पते की पुष्टि भी की जाती है.
ईमेल से साइन इन करने के कई फ़ायदे हैं:
- आसानी से साइन अप और साइन इन किया जा सकता है.
- अलग-अलग ऐप्लिकेशन के लिए एक ही पासवर्ड इस्तेमाल करने का खतरा कम होता है. ऐसा करने से, अच्छी तरह से चुने गए पासवर्ड की सुरक्षा भी कमज़ोर हो सकती है.
- उपयोगकर्ता की पुष्टि करने के साथ-साथ, यह भी पुष्टि की जा सकती है कि उपयोगकर्ता, ईमेल पते का असली मालिक है.
- साइन इन करने के लिए, उपयोगकर्ता के पास सिर्फ़ एक ऐसा ईमेल खाता होना चाहिए जिसे ऐक्सेस किया जा सके. इसके लिए, फ़ोन नंबर या सोशल मीडिया खाते का मालिकाना हक होना ज़रूरी नहीं है.
- उपयोगकर्ता, पासवर्ड दिए (या याद रखे) बिना सुरक्षित तरीके से साइन इन कर सकता है. मोबाइल डिवाइस पर पासवर्ड याद रखना मुश्किल हो सकता है.
- कोई मौजूदा उपयोगकर्ता, जिसने पहले ईमेल आइडेंटिफ़ायर (पासवर्ड या फ़ेडरेटेड) से साइन इन किया था, उसे सिर्फ़ ईमेल से साइन इन करने के लिए अपग्रेड किया जा सकता है. उदाहरण के लिए, अगर कोई उपयोगकर्ता अपना पासवर्ड भूल गया है, तो वह पासवर्ड रीसेट किए बिना भी साइन इन कर सकता है.
शुरू करने से पहले
अगर आपने पहले से ही ऐसा नहीं किया है, तो Firebase कंसोल से, शुरुआती स्निपेट को अपने प्रोजेक्ट में कॉपी करें. इसके लिए, JavaScript प्रोजेक्ट में Firebase जोड़ना लेख में दिया गया तरीका अपनाएं.
अपने Firebase प्रोजेक्ट के लिए, ईमेल लिंक से साइन इन करने की सुविधा चालू करना
ईमेल लिंक की मदद से उपयोगकर्ताओं को साइन इन करने की सुविधा देने के लिए, आपको अपने Firebase प्रोजेक्ट के लिए, ईमेल देने वाली कंपनी और ईमेल लिंक से साइन इन करने का तरीका चालू करना होगा:
Firebase कंसोल में, सुरक्षा > पुष्टि पर जाएं.
साइन-इन करने का तरीका टैब में, ईमेल/पासवर्ड से साइन-इन करने का तरीका चालू करें. ध्यान दें कि ईमेल लिंक से साइन-इन करने के लिए, ईमेल/पासवर्ड से साइन-इन करने की सुविधा चालू होनी चाहिए.
इसी सेक्शन में, ईमेल लिंक (बिना पासवर्ड के साइन-इन) से साइन-इन करने की सुविधा देने वाली कंपनी को चालू करें.
सेव करें पर क्लिक करें.
उपयोगकर्ता के ईमेल पते पर, पुष्टि करने के लिए लिंक भेजना
पुष्टि करने की प्रोसेस शुरू करने के लिए, उपयोगकर्ता को एक ऐसा इंटरफ़ेस दिखाएं जिसमें उससे उसका ईमेल पता मांगा जाए. इसके बाद, Firebase से उपयोगकर्ता के ईमेल पर पुष्टि करने के लिए लिंक भेजने का अनुरोध करने के लिए, sendSignInLinkToEmail को कॉल करें.
ActionCodeSettingsऑब्जेक्ट बनाएं. इससे Firebase को ईमेल लिंक बनाने के तरीके के बारे में निर्देश मिलते हैं. ये फ़ील्ड सेट करें:url: एम्बेड करने के लिए डीप लिंक और पास करने के लिए कोई अतिरिक्त स्टेट. अगर आपने पहले से ही ऐसा नहीं किया है, तो अनुमति वाले डोमेन की सूची में अपना डोमेन जोड़ें:Firebase कंसोल में, सुरक्षा > पुष्टि > सेटिंग टैब पर जाएं.
अनुमति वाले डोमेन सेक्शन में, डोमेन जोड़ें पर क्लिक करें. इसके बाद, अपना डोमेन जोड़ें .
androidऔरios: इससे Firebase Authentication को यह तय करने में मदद मिलती है कि उसे सिर्फ़ वेब लिंक बनाना चाहिए या मोबाइल लिंक. मोबाइल लिंक, Android या Apple डिवाइस पर खुलता है.handleCodeInApp: इसे 'सही' पर सेट करें. साइन-इन करने की कार्रवाई हमेशा ऐप्लिकेशन में पूरी करनी होती है. ऐसा, ईमेल से जुड़ी अन्य कार्रवाइयों (पासवर्ड रीसेट करना और ईमेल की पुष्टि करना) के लिए ज़रूरी नहीं है. ऐसा इसलिए, क्योंकि प्रोसेस के आखिर में, उपयोगकर्ता को साइन इन किया हुआ माना जाता है और उसकी पुष्टि की स्थिति, ऐप्लिकेशन में सेव रहती है.linkDomain: जब किसी प्रोजेक्ट के लिए, कस्टम Hosting लिंक डोमेन तय किए जाते हैं, तो यह तय करें कि किसी खास मोबाइल ऐप्लिकेशन से लिंक खोलने पर, किस डोमेन का इस्तेमाल करना है. ऐसा न करने पर, डिफ़ॉल्ट डोमेन अपने-आप चुना जाता है. उदाहरण के लिए, .PROJECT_ID.firebaseapp.comdynamicLinkDomain: अब सेवा में नहीं है. यह पैरामीटर तय न करें.Web
const actionCodeSettings = { // URL you want to redirect back to. The domain (www.example.com) for this // URL must be in the authorized domains list in the Firebase Console. url: 'https://www.example.com/finishSignUp?cartId=1234', // This must be true. handleCodeInApp: true, iOS: { bundleId: 'com.example.ios' }, android: { packageName: 'com.example.android', installApp: true, minimumVersion: '12' }, // The domain must be configured in Firebase Hosting and owned by the project. linkDomain: 'custom-domain.com' };
Web
var actionCodeSettings = { // URL you want to redirect back to. The domain (www.example.com) for this // URL must be in the authorized domains list in the Firebase Console. url: 'https://www.example.com/finishSignUp?cartId=1234', // This must be true. handleCodeInApp: true, iOS: { bundleId: 'com.example.ios' }, android: { packageName: 'com.example.android', installApp: true, minimumVersion: '12' }, dynamicLinkDomain: 'example.page.link' };
ActionCodeSettingsके बारे में ज़्यादा जानने के लिए, ईमेल से जुड़ी कार्रवाइयों में स्टेट पास करना सेक्शन देखें.उपयोगकर्ता से उसका ईमेल पता मांगें.
उपयोगकर्ता के ईमेल पर, पुष्टि करने के लिए लिंक भेजें. साथ ही, उपयोगकर्ता का ईमेल सेव करें, ताकि अगर उपयोगकर्ता उसी डिवाइस पर ईमेल से साइन-इन करने की प्रोसेस पूरी करता है, तो उसे फिर से ईमेल पता न डालना पड़े.
Web
import { getAuth, sendSignInLinkToEmail } from "firebase/auth"; const auth = getAuth(); sendSignInLinkToEmail(auth, email, actionCodeSettings) .then(() => { // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. window.localStorage.setItem('emailForSignIn', email); // ... }) .catch((error) => { const errorCode = error.code; const errorMessage = error.message; // ... });
Web
firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings) .then(() => { // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. window.localStorage.setItem('emailForSignIn', email); // ... }) .catch((error) => { var errorCode = error.code; var errorMessage = error.message; // ... });
ईमेल लिंक की मदद से साइन इन करना
सुरक्षा से जुड़ी चिंताएं
Firebase Auth, साइन-इन लिंक का इस्तेमाल करके, किसी दूसरे उपयोगकर्ता या किसी दूसरे डिवाइस पर साइन इन करने से रोकता है. इसके लिए, Firebase Auth, साइन-इन की प्रोसेस पूरी करते समय, उपयोगकर्ता का ईमेल पता मांगता है. साइन-इन करने के लिए, यह ज़रूरी है कि ईमेल पता, उस पते से मैच करे जिस पर साइन-इन लिंक भेजा गया था.
अगर उपयोगकर्ता, लिंक का अनुरोध करने वाले डिवाइस पर ही साइन-इन लिंक खोलता है, तो इस प्रोसेस को आसान बनाया जा सकता है. इसके लिए, साइन-इन का ईमेल भेजते समय, उपयोगकर्ता का ईमेल पता स्थानीय तौर पर सेव करें. उदाहरण के लिए, localStorage या कुकी का इस्तेमाल करके. इसके बाद, प्रोसेस पूरी करने के लिए इस पते का इस्तेमाल करें. रीडाइरेक्ट यूआरएल के पैरामीटर में, उपयोगकर्ता का ईमेल पता पास न करें और न ही उसका फिर से इस्तेमाल करें. ऐसा करने से, सेशन इंजेक्शन हो सकते हैं.
साइन-इन करने की प्रोसेस पूरी होने के बाद, साइन-इन करने का वह तरीका हटा दिया जाएगा जिसकी पुष्टि नहीं की गई थी. साथ ही, मौजूदा सभी सेशन अमान्य हो जाएंगे. उदाहरण के लिए, अगर किसी व्यक्ति ने पहले उसी ईमेल और पासवर्ड से, बिना पुष्टि किया गया खाता बनाया था, तो उपयोगकर्ता का पासवर्ड हटा दिया जाएगा. ऐसा इसलिए किया जाएगा, ताकि वह व्यक्ति, बिना पुष्टि किए गए ईमेल और पासवर्ड से फिर से साइन इन न कर सके, जिसने मालिकाना हक का दावा किया था और बिना पुष्टि किया गया खाता बनाया था.
साथ ही, पक्का करें कि प्रोडक्शन में एचटीटीपीएस यूआरएल का इस्तेमाल किया जाए, ताकि इंटरमीडियरी सर्वर आपके लिंक को इंटरसेप्ट न कर सकें.
वेब पेज पर साइन-इन करना
ईमेल लिंक के डीप लिंक का फ़ॉर्मैट, ईमेल से जुड़ी अन्य कार्रवाइयों
(ईमेल पते की पुष्टि, पासवर्ड फिर सेट करें, और ईमेल बदलने की कार्रवाई रद्द करना)
के लिए इस्तेमाल किए जाने वाले फ़ॉर्मैट जैसा ही होता है.
Firebase Auth, isSignInWithEmailLink एपीआई उपलब्ध कराकर, इस जांच को आसान बनाता है. इससे यह पता चलता है कि कोई लिंक, ईमेल लिंक से साइन-इन करने का लिंक है या नहीं.
लैंडिंग पेज पर साइन-इन करने के लिए, उपयोगकर्ता के ईमेल और एक बार इस्तेमाल किया जा सकने वाला कोड वाले ईमेल लिंक के साथ, signInWithEmailLink को कॉल करें.
Web
import { getAuth, isSignInWithEmailLink, signInWithEmailLink } from "firebase/auth"; // Confirm the link is a sign-in with email link. const auth = getAuth(); if (isSignInWithEmailLink(auth, window.location.href)) { // Additional state parameters can also be passed via URL. // This can be used to continue the user's intended action before triggering // the sign-in operation. // Get the email if available. This should be available if the user completes // the flow on the same device where they started it. let email = window.localStorage.getItem('emailForSignIn'); if (!email) { // User opened the link on a different device. To prevent session fixation // attacks, ask the user to provide the associated email again. For example: email = window.prompt('Please provide your email for confirmation'); } // The client SDK will parse the code from the link for you. signInWithEmailLink(auth, email, window.location.href) .then((result) => { // Clear email from storage. window.localStorage.removeItem('emailForSignIn'); // You can access the new user by importing getAdditionalUserInfo // and calling it with result: // getAdditionalUserInfo(result) // You can access the user's profile via: // getAdditionalUserInfo(result)?.profile // You can check if the user is new or existing: // getAdditionalUserInfo(result)?.isNewUser }) .catch((error) => { // Some error occurred, you can inspect the code: error.code // Common errors could be invalid email and invalid or expired OTPs. }); }
Web
// Confirm the link is a sign-in with email link. if (firebase.auth().isSignInWithEmailLink(window.location.href)) { // Additional state parameters can also be passed via URL. // This can be used to continue the user's intended action before triggering // the sign-in operation. // Get the email if available. This should be available if the user completes // the flow on the same device where they started it. var email = window.localStorage.getItem('emailForSignIn'); if (!email) { // User opened the link on a different device. To prevent session fixation // attacks, ask the user to provide the associated email again. For example: email = window.prompt('Please provide your email for confirmation'); } // The client SDK will parse the code from the link for you. firebase.auth().signInWithEmailLink(email, window.location.href) .then((result) => { // Clear email from storage. window.localStorage.removeItem('emailForSignIn'); // You can access the new user via result.user // Additional user info profile not available via: // result.additionalUserInfo.profile == null // You can check if the user is new or existing: // result.additionalUserInfo.isNewUser }) .catch((error) => { // Some error occurred, you can inspect the code: error.code // Common errors could be invalid email and invalid or expired OTPs. }); }
मोबाइल ऐप्लिकेशन में साइन-इन करना
Firebase Authentication ईमेल लिंक को मोबाइल डिवाइस पर भेजने के लिए, Firebase Hosting का इस्तेमाल करती है. मोबाइल ऐप्लिकेशन के ज़रिए साइन-इन करने के लिए, ऐप्लिकेशन को आने वाले ऐप्लिकेशन लिंक का पता लगाने, उसके डीप लिंक को पार्स करने, और फिर वेब फ़्लो के ज़रिए किए जाने वाले तरीके से साइन-इन करने के लिए कॉन्फ़िगर करना होगा.
Android ऐप्लिकेशन में, ईमेल लिंक से साइन-इन करने की सुविधा को मैनेज करने के बारे में ज़्यादा जानने के लिए, Android के लिए बनी गाइड देखें.
Apple ऐप्लिकेशन में, ईमेल लिंक से साइन-इन करने की सुविधा को मैनेज करने के बारे में ज़्यादा जानने के लिए, Apple प्लैटफ़ॉर्म के लिए बनी गाइड देखें.
ईमेल लिंक से लिंक करना/फिर से पुष्टि करना
पुष्टि करने के इस तरीके को, किसी मौजूदा उपयोगकर्ता से भी लिंक किया जा सकता है. उदाहरण के लिए, किसी उपयोगकर्ता ने पहले किसी अन्य कंपनी से पुष्टि की थी. जैसे, फ़ोन नंबर से. वह अपने मौजूदा खाते में, साइन-इन करने का यह तरीका जोड़ सकता है.
कार्रवाई के दूसरे हिस्से में अंतर होगा:
Web
import { getAuth, linkWithCredential, EmailAuthProvider } from "firebase/auth"; // Construct the email link credential from the current URL. const credential = EmailAuthProvider.credentialWithLink( email, window.location.href); // Link the credential to the current user. const auth = getAuth(); linkWithCredential(auth.currentUser, credential) .then((usercred) => { // The provider is now successfully linked. // The phone user can now sign in with their phone number or email. }) .catch((error) => { // Some error occurred. });
Web
// Construct the email link credential from the current URL. var credential = firebase.auth.EmailAuthProvider.credentialWithLink( email, window.location.href); // Link the credential to the current user. firebase.auth().currentUser.linkWithCredential(credential) .then((usercred) => { // The provider is now successfully linked. // The phone user can now sign in with their phone number or email. }) .catch((error) => { // Some error occurred. });
इसका इस्तेमाल, संवेदनशील कार्रवाई करने से पहले, ईमेल लिंक वाले उपयोगकर्ता की फिर से पुष्टि करने के लिए भी किया जा सकता है.
Web
import { getAuth, reauthenticateWithCredential, EmailAuthProvider } from "firebase/auth"; // Construct the email link credential from the current URL. const credential = EmailAuthProvider.credentialWithLink( email, window.location.href); // Re-authenticate the user with this credential. const auth = getAuth(); reauthenticateWithCredential(auth.currentUser, credential) .then((usercred) => { // The user is now successfully re-authenticated and can execute sensitive // operations. }) .catch((error) => { // Some error occurred. });
Web
// Construct the email link credential from the current URL. var credential = firebase.auth.EmailAuthProvider.credentialWithLink( email, window.location.href); // Re-authenticate the user with this credential. firebase.auth().currentUser.reauthenticateWithCredential(credential) .then((usercred) => { // The user is now successfully re-authenticated and can execute sensitive // operations. }) .catch((error) => { // Some error occurred. });
हालांकि, ऐसा हो सकता है कि फ़्लो किसी दूसरे डिवाइस पर खत्म हो, जहां असली उपयोगकर्ता ने लॉग इन न किया हो. इसलिए, यह फ़्लो पूरा नहीं हो पाएगा. ऐसे में, उपयोगकर्ता को गड़बड़ी दिखाई जा सकती है, ताकि वह उसी डिवाइस पर लिंक खोले. कार्रवाई के टाइप और उपयोगकर्ता के यूआईडी के बारे में जानकारी देने के लिए, लिंक में कुछ स्टेट पास की जा सकती हैं.
अब सेवा में नहीं है: ईमेल-पासवर्ड और ईमेल लिंक में अंतर करना
अगर आपने अपना प्रोजेक्ट 15 सितंबर, 2023 को या उसके बाद बनाया है, तो ईमेल की गिनती से सुरक्षा की सुविधा डिफ़ॉल्ट रूप से चालू होती है. इस सुविधा से, आपके प्रोजेक्ट के उपयोगकर्ता खातों की सुरक्षा बेहतर होती है. हालांकि, इससे fetchSignInMethodsForEmail() तरीका बंद हो जाता है. पहले, हम आइडेंटिफ़ायर-फ़र्स्ट फ़्लो लागू करने के लिए, इस तरीके का इस्तेमाल करने की सलाह देते थे.
हालांकि, आपके पास अपने प्रोजेक्ट के लिए, ईमेल की गिनती से सुरक्षा की सुविधा बंद करने का विकल्प है, लेकिन हम ऐसा करने की सलाह नहीं देते.
ज़्यादा जानकारी के लिए, ईमेल की गिनती से सुरक्षा के बारे में दस्तावेज़ देखें.
लिंक से साइन-इन करने के लिए, ईमेल का डिफ़ॉल्ट टेंप्लेट
ईमेल के डिफ़ॉल्ट टेंप्लेट में, विषय और ईमेल के मुख्य हिस्से में टाइमस्टैंप शामिल होता है ताकि बाद के ईमेल एक ही थ्रेड में न दिखें और लिंक छिप न जाए.
यह टेंप्लेट इन भाषाओं पर लागू होता है:
| कोड | भाषा |
|---|---|
| ar | ऐरेबिक |
| zh-CN | चाइनीज़ (सिंप्लिफ़ाइड) |
| zh-TW | चाइनीज़ (ट्रेडिशनल) |
| nl | डच |
| en | अंग्रेज़ी |
| en-GB | अंग्रेज़ी (यूके) |
| fr | फ़्रेंच |
| de | जर्मन |
| id | इंडोनेशियन |
| it | इटैलियन |
| ja | जैपनीज़ |
| ko | कोरियन |
| pl | पोलिश |
| pt-BR | पॉर्चुगीज़ (ब्राज़ील) |
| pt-PT | पॉर्चगीज़ (पुर्तगाल) |
| ru | रशियन |
| es | स्पैनिश |
| es-419 | स्पैनिश (लैटिन अमेरिका) |
| th | थाई |
अगले चरण
जब कोई उपयोगकर्ता पहली बार साइन इन करता है, तो एक नया उपयोगकर्ता खाता बनता है और उसे क्रेडेंशियल से लिंक किया जाता है. क्रेडेंशियल का मतलब है, उपयोगकर्ता नाम और पासवर्ड, फ़ोन नंबर या पुष्टि करने वाली कंपनी की जानकारी. उपयोगकर्ता, इन क्रेडेंशियल की मदद से साइन इन करता है. यह नया खाता, आपके Firebase प्रोजेक्ट के हिस्से के तौर पर सेव किया जाता है. इसका इस्तेमाल, आपके प्रोजेक्ट के हर ऐप्लिकेशन में किसी उपयोगकर्ता की पहचान करने के लिए किया जा सकता है. भले ही, उपयोगकर्ता किसी भी तरीके से साइन इन करे.
-
अपने ऐप्लिकेशन में, उपयोगकर्ता की पुष्टि की स्थिति जानने के लिए,
Authऑब्जेक्ट पर ऑब्ज़र्वर सेट करने का सुझाव दिया जाता है. इसके बाद,Userऑब्जेक्ट से उपयोगकर्ता की बुनियादी प्रोफ़ाइल की जानकारी पाई जा सकती है. उपयोगकर्ताओं को मैनेज करना लेख देखें. आपके Firebase Realtime Database और Cloud Storage सुरक्षा नियमों में, आप साइन इन किए हुए उपयोगकर्ता की यूनीक उपयोगकर्ता आईडी
authवैरिएबल से पा सकते हैं, और इसका इस्तेमाल, यह कंट्रोल करने के लिए कर सकते हैं कि कोई उपयोगकर्ता किस डेटा को ऐक्सेस कर सकता है.
पुष्टि करने वाली एक से ज़्यादा कंपनियों का इस्तेमाल करके, उपयोगकर्ताओं को पुष्टि करने वाली कंपनी के क्रेडेंशियल को किसी मौजूदा उपयोगकर्ता खाते से लिंक करके, आपके ऐप्लिकेशन में साइन इन करने की अनुमति दी जा सकती है.
किसी उपयोगकर्ता को साइन आउट करने के लिए,
signOut को कॉल करें:
Web
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });