JavaScript के साथ Yahoo का इस्तेमाल करके पुष्टि करें

अपने उपयोगकर्ताओं को Firebase की मदद से पुष्टि करने की अनुमति दी जा सकती है. इसके लिए, Yahoo जैसे OAuth प्रोवाइडर का इस्तेमाल करें. इसके लिए, Firebase SDK टूल का इस्तेमाल करके, अपने ऐप्लिकेशन में सामान्य OAuth लॉगिन को इंटिग्रेट करें. इससे, साइन-इन करने का पूरा फ़्लो पूरा किया जा सकता है.

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

Yahoo खातों का इस्तेमाल करके उपयोगकर्ताओं को साइन इन कराने के लिए, आपको अपने Firebase प्रोजेक्ट के लिए, साइन-इन की सुविधा देने वाली कंपनी के तौर पर Yahoo को चालू करना होगा:

  1. अपने JavaScript प्रोजेक्ट में Firebase जोड़ें.
  2. Firebase कंसोल में, Auth सेक्शन खोलें.
  3. साइन इन करने का तरीका टैब पर, Yahoo की सेवा देने वाली कंपनी को चालू करें.
  4. सेवा देने वाली कंपनी के डेवलपर कंसोल से, क्लाइंट आईडी और क्लाइंट सीक्रेट को सेवा देने वाली कंपनी के कॉन्फ़िगरेशन में जोड़ें:
    1. Yahoo OAuth क्लाइंट को रजिस्टर करने के लिए, Yahoo के साथ वेब ऐप्लिकेशन रजिस्टर करने के बारे में Yahoo डेवलपर के दस्तावेज़ में दिया गया तरीका अपनाएं.

      OpenID Connect API की दो अनुमतियां चुनना न भूलें: profile और email.

    2. इन सेवा देने वाली कंपनियों के साथ ऐप्लिकेशन रजिस्टर करते समय, अपने प्रोजेक्ट के लिए *.firebaseapp.com डोमेन को अपने ऐप्लिकेशन के लिए रीडायरेक्ट डोमेन के तौर पर रजिस्टर करना न भूलें.
  5. सेव करें पर क्लिक करें.

Firebase SDK टूल की मदद से, साइन इन फ़्लो को मैनेज करना

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

Firebase JavaScript SDK की मदद से साइन-इन फ़्लो को मैनेज करने के लिए, यह तरीका अपनाएं:

  1. प्रोवाइडर आईडी yahoo.com का इस्तेमाल करके, OAuthProvider का एक इंस्टेंस बनाएं.

    WebWeb
    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('yahoo.com');
    var provider = new firebase.auth.OAuthProvider('yahoo.com');
  2. ज़रूरी नहीं: ऐसे अन्य कस्टम OAuth पैरामीटर बताएं जिन्हें आपको OAuth अनुरोध के साथ भेजना है.

    WebWeb
    provider.setCustomParameters({
      // Prompt user to re-authenticate to Yahoo.
      prompt: 'login',
      // Localize to French.
      language: 'fr'
    });  
    provider.setCustomParameters({
      // Prompt user to re-authenticate to Yahoo.
      prompt: 'login',
      // Localize to French.
      language: 'fr'
    });  

    Yahoo के साथ काम करने वाले पैरामीटर के बारे में जानने के लिए, Yahoo OAuth दस्तावेज़ देखें. ध्यान दें कि setCustomParameters() के साथ, Firebase के लिए ज़रूरी पैरामीटर पास नहीं किए जा सकते. ये पैरामीटर client_id, redirect_uri, response_type, scope, और state हैं.

  3. ज़रूरी नहीं: profile और email के अलावा, OAuth 2.0 के ऐसे अन्य स्कोप बताएं जिनके लिए आपको पुष्टि करने वाली सेवा देने वाली कंपनी से अनुरोध करना है. अगर आपके ऐप्लिकेशन को Yahoo के एपीआई से उपयोगकर्ता के निजी डेटा को ऐक्सेस करने की ज़रूरत है, तो आपको Yahoo डेवलपर कंसोल में एपीआई की अनुमतियां में जाकर, Yahoo के एपीआई से अनुमतियां मांगनी होंगी. अनुरोध किए गए OAuth स्कोप, ऐप्लिकेशन की एपीआई अनुमतियों में पहले से तय किए गए स्कोप से पूरी तरह मैच होने चाहिए. उदाहरण के लिए, अगर उपयोगकर्ता के संपर्कों को पढ़ने/लिखने का ऐक्सेस मांगा जाता है और ऐप्लिकेशन की एपीआई अनुमतियों में पहले से कॉन्फ़िगर किया गया है, तो सिर्फ़ पढ़ने के लिए इस्तेमाल किए जाने वाले OAuth स्कोप sdct-r के बजाय, sdct-w को पास करना होगा. ऐसा न करने पर, फ़्लो पूरा नहीं होगा और आखिरी उपयोगकर्ता को गड़बड़ी का मैसेज दिखेगा.

    WebWeb
    // Request access to Yahoo Mail API.
    provider.addScope('mail-r');
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    provider.addScope('sdct-w');
    // Request access to Yahoo Mail API.
    provider.addScope('mail-r');
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    provider.addScope('sdct-w');

    ज़्यादा जानने के लिए, Yahoo के स्कोप के दस्तावेज़ देखें.

  4. OAuth प्रोवाइडर ऑब्जेक्ट का इस्तेमाल करके, Firebase से पुष्टि करना. उपयोगकर्ताओं को अपने Yahoo खातों से साइन इन करने के लिए कहा जा सकता है. इसके लिए, पॉप-अप विंडो खोलें या साइन-इन पेज पर रीडायरेक्ट करें. मोबाइल डिवाइसों पर, रीडायरेक्ट करने का तरीका इस्तेमाल करना बेहतर होता है.

    • पॉप-अप विंडो से साइन इन करने के लिए, signInWithPopup को कॉल करें:

      WebWeb
      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // IdP data available in result.additionalUserInfo.profile
          // ...
      
          // Yahoo OAuth access token and ID token can be retrieved by calling:
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });
      firebase.auth().signInWithPopup(provider)
        .then((result) => {
          // IdP data available in result.additionalUserInfo.profile
          // ...
      
          /** @type {firebase.auth.OAuthCredential} */
          const credential = result.credential;
      
          // Yahoo OAuth access token and ID token can be retrieved by calling:
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });
    • साइन इन पेज पर रीडायरेक्ट करके साइन इन करने के लिए, signInWithRedirect को कॉल करें:

    signInWithRedirect, linkWithRedirect या reauthenticateWithRedirect का इस्तेमाल करते समय, सबसे सही तरीके अपनाएं.

      firebase.auth().signInWithRedirect(provider);
      

    जब उपयोगकर्ता साइन इन कर लेता है और पेज पर वापस आ जाता है, तो getRedirectResult को कॉल करके, साइन इन का नतीजा पाया जा सकता है.

    WebWeb
    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);
    firebase.auth().signInWithRedirect(provider);

    पुष्टि हो जाने के बाद, सेवा देने वाली कंपनी से जुड़े OAuth आईडी टोकन और ऐक्सेस टोकन को, दिखाए गए firebase.auth.UserCredential ऑब्जेक्ट से वापस पाया जा सकता है.

    OAuth ऐक्सेस टोकन का इस्तेमाल करके, Yahoo API को कॉल किया जा सकता है.

    उदाहरण के लिए, प्रोफ़ाइल की बुनियादी जानकारी पाने के लिए, इस REST API को कॉल किया जा सकता है:

    curl -i -H "Authorization: Bearer ACCESS_TOKEN" https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json

    यहां YAHOO_USER_UID, Yahoo उपयोगकर्ता का आईडी है, जिसे firebase.auth().currentUser.providerData[0].uid फ़ील्ड या result.additionalUserInfo.profile से पाया जा सकता है.

  5. ऊपर दिए गए उदाहरण, साइन इन फ़्लो पर फ़ोकस करते हैं. हालांकि, आपके पास linkWithPopup/linkWithRedirect का इस्तेमाल करके, Yahoo की सेवा देने वाली कंपनी को किसी मौजूदा उपयोगकर्ता से लिंक करने का विकल्प भी है. उदाहरण के लिए, एक ही उपयोगकर्ता से कई सेवा देने वाली कंपनियों को लिंक किया जा सकता है, ताकि वह किसी भी कंपनी से साइन इन कर सके.

    WebWeb
    import { getAuth, linkWithPopup, OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('yahoo.com');
    const auth = getAuth();
    linkWithPopup(auth.currentUser, provider)
        .then((result) => {
          // Yahoo credential is linked to the current user.
          // IdP data available in result.additionalUserInfo.profile.
    
          // Get the OAuth access token and ID Token
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });
    var provider = new firebase.auth.OAuthProvider('yahoo.com');
    firebase.auth().currentUser.linkWithPopup(provider)
        .then((result) => {
          // Yahoo credential is linked to the current user.
          // IdP data available in result.additionalUserInfo.profile.
          // Yahoo OAuth access token can be retrieved by calling:
          // result.credential.accessToken
          // Yahoo OAuth ID token can be retrieved by calling:
          // result.credential.idToken
        })
        .catch((error) => {
          // Handle error.
        });
  6. इसी पैटर्न का इस्तेमाल reauthenticateWithPopup/reauthenticateWithRedirect के साथ किया जा सकता है. इसका इस्तेमाल, संवेदनशील कार्रवाइयों के लिए नए क्रेडेंशियल पाने के लिए किया जा सकता है. इन कार्रवाइयों के लिए, हाल ही में लॉगिन करना ज़रूरी होता है.

    WebWeb
    import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('yahoo.com');
    const auth = getAuth();
    reauthenticateWithPopup(auth.currentUser, provider)
        .then((result) => {
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
    
          // Get the OAuth access token and ID Token
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        })
        .catch((error) => {
          // Handle error.
        });
    var provider = new firebase.auth.OAuthProvider('yahoo.com');
    firebase.auth().currentUser.reauthenticateWithPopup(provider)
        .then((result) => {
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Yahoo OAuth access token can be retrieved by calling:
          // result.credential.accessToken
          // Yahoo OAuth ID token can be retrieved by calling:
          // result.credential.idToken
        })
        .catch((error) => {
          // Handle error.
        });

अगर आपने Firebase कंसोल में हर ईमेल पते के लिए एक खाता सेटिंग चालू की है, तो जब कोई उपयोगकर्ता किसी ईमेल पते से किसी सेवा देने वाली कंपनी (जैसे, Yahoo) में साइन इन करने की कोशिश करता है, जो पहले से ही Firebase के किसी अन्य उपयोगकर्ता की सेवा देने वाली कंपनी (जैसे, Google) के लिए मौजूद है, तो उसे गड़बड़ी का मैसेज auth/account-exists-with-different-credential दिखता है. साथ ही, AuthCredential ऑब्जेक्ट (Yahoo क्रेडेंशियल) भी दिखता है. अपने चुने गए सेवा देने वालेAuthCredential

signInWithPopup का इस्तेमाल करने पर, auth/account-exists-with-different-credential गड़बड़ियों को इस तरह के कोड की मदद से मैनेज किया जा सकता है:

import {
  getAuth,
  linkWithCredential,
  signInWithPopup,
  OAuthProvider,
} from "firebase/auth";

try {
  // Step 1: User tries to sign in using Yahoo.
  let result = await signInWithPopup(getAuth(), new OAuthProvider());
} catch (error) {
  // Step 2: User's email already exists.
  if (error.code === "auth/account-exists-with-different-credential") {
    // The pending Yahoo credential.
    let pendingCred = error.credential;

    // Step 3: Save the pending credential in temporary storage,

    // Step 4: Let the user know that they already have an account
    // but with a different provider, and let them choose another
    // sign-in method.
  }
}

// ...

try {
  // Step 5: Sign the user in using their chosen method.
  let result = await signInWithPopup(getAuth(), userSelectedProvider);

  // Step 6: Link to the Yahoo credential.
  // TODO: implement `retrievePendingCred` for your app.
  let pendingCred = retrievePendingCred();

  if (pendingCred !== null) {
    // As you have access to the pending credential, you can directly call the
    // link method.
    let user = await linkWithCredential(result.user, pendingCred);
  }

  // Step 7: Continue to app.
} catch (error) {
  // ...
}

रीडायरेक्ट मोड

रीडायरेक्ट मोड में भी इस गड़बड़ी को इसी तरह मैनेज किया जाता है. हालांकि, इस मोड में पेज रीडायरेक्ट के बीच, पुष्टि बाकी होने वाले क्रेडेंशियल को कैश मेमोरी में सेव करना पड़ता है. उदाहरण के लिए, सेशन स्टोरेज का इस्तेमाल करके.

Firebase के साथ काम करने वाली OAuth सेवा देने वाली अन्य कंपनियों, जैसे कि Google, Facebook, और Twitter के मुकाबले, Firebase Auth में यह सुविधा उपलब्ध नहीं है कि OAuth ऐक्सेस टोकन पर आधारित क्रेडेंशियल का इस्तेमाल करके सीधे साइन इन किया जा सके. Yahoo जैसी कंपनियों के लिए, Firebase Auth में यह सुविधा उपलब्ध नहीं है. इसकी वजह यह है कि Firebase Auth सर्वर, Yahoo OAuth ऐक्सेस टोकन की ऑडियंस की पुष्टि नहीं कर सकता. यह सुरक्षा से जुड़ी एक ज़रूरी शर्त है. इससे ऐप्लिकेशन और वेबसाइटों को फिर से होने वाले हमलों का शिकार बनाया जा सकता है. इन हमलों में, एक प्रोजेक्ट (हमलावर) के लिए मिले Yahoo OAuth ऐक्सेस टोकन का इस्तेमाल, किसी दूसरे प्रोजेक्ट (पीड़ित) में साइन इन करने के लिए किया जा सकता है. इसके बजाय, Firebase Auth पूरे OAuth फ़्लो और ऑथराइज़ेशन कोड एक्सचेंज को मैनेज करने की सुविधा देता है. इसके लिए, Firebase कंसोल में कॉन्फ़िगर किए गए OAuth क्लाइंट आईडी और सीक्रेट का इस्तेमाल किया जाता है. अनुमति कोड का इस्तेमाल सिर्फ़ किसी खास क्लाइंट आईडी/सीक्रेट के साथ किया जा सकता है. इसलिए, किसी एक प्रोजेक्ट के लिए मिले अनुमति कोड का इस्तेमाल किसी दूसरे प्रोजेक्ट के लिए नहीं किया जा सकता.

अगर इन सेवाओं का इस्तेमाल ऐसे एनवायरमेंट में करना है जहां ये काम नहीं करतीं, तो तीसरे पक्ष की OAuth लाइब्रेरी और Firebase के कस्टम ऑथेंटिकेशन का इस्तेमाल करना होगा. पहले को सेवा देने वाली कंपनी की पुष्टि करने के लिए ज़रूरत होती है और दूसरे को सेवा देने वाली कंपनी के क्रेडेंशियल को कस्टम टोकन के लिए एक्सचेंज करने के लिए ज़रूरत होती है.

Chrome एक्सटेंशन में Firebase की मदद से पुष्टि करना

अगर आपको Chrome एक्सटेंशन ऐप्लिकेशन बनाना है, तो ऑफ़स्क्रीन दस्तावेज़ों से जुड़ी गाइड देखें.

प्रोजेक्ट बनाने पर, Firebase आपके प्रोजेक्ट के लिए एक यूनीक सबडोमेन उपलब्ध कराएगा: https://my-app-12345.firebaseapp.com.

इसका इस्तेमाल, OAuth साइन इन के लिए रीडायरेक्ट करने के तरीके के तौर पर भी किया जाएगा. उस डोमेन को, OAuth की सुविधा देने वाली सभी कंपनियों के लिए अनुमति दी जानी चाहिए. हालांकि, इसका मतलब है कि उपयोगकर्ताओं को ऐप्लिकेशन पर वापस रीडायरेक्ट करने से पहले, Yahoo में साइन इन करते समय वह डोमेन दिख सकता है: इस पर जाएं: https://my-app-12345.firebaseapp.com.

अपना सबडोमेन न दिखाने के लिए, Firebase Hosting की मदद से कस्टम डोमेन सेट अप किया जा सकता है:

  1. Hosting के लिए अपना डोमेन सेट अप करें में दिए गए पहले से तीसरे चरण को पूरा करें. डोमेन के मालिकाना हक की पुष्टि करने पर, Hosting आपके कस्टम डोमेन के लिए एसएसएल सर्टिफ़िकेट उपलब्ध कराता है.
  2. Firebase कंसोल में, अनुमति वाले डोमेन की सूची में अपना कस्टम डोमेन जोड़ें: auth.custom.domain.com.
  3. Yahoo डेवलपर कंसोल या OAuth सेटअप पेज में, रीडायरेक्ट पेज के यूआरएल को व्हाइटलिस्ट करें. यह यूआरएल, आपके कस्टम डोमेन: https://auth.custom.domain.com/__/auth/handler पर ऐक्सेस किया जा सकेगा.
  4. JavaScript लाइब्रेरी को शुरू करते समय, authDomain फ़ील्ड की मदद से अपना कस्टम डोमेन डालें:
    var config = {
      apiKey: '...',
      // Changed from 'PROJECT_ID.firebaseapp.com'.
      authDomain: 'auth.custom.domain.com',
      databaseURL: 'https://PROJECT_ID.firebaseio.com',
      projectId: 'PROJECT_ID',
      storageBucket: 'PROJECT_ID.firebasestorage.app',
      messagingSenderId: 'SENDER_ID'
    };
    firebase.initializeApp(config);

अगले चरण

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

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

  • अपने Firebase Realtime Database और Cloud Storage सुरक्षा नियमों में, आपके पास auth वैरिएबल से साइन इन किए गए उपयोगकर्ता का यूनीक उपयोगकर्ता आईडी पाने का विकल्प है. साथ ही, इसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.

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

किसी उपयोगकर्ता को साइन आउट करने के लिए, signOut को कॉल करें:

WebWeb
import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});
firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});