Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

क्लाउड फ़ंक्शंस को अवरुद्ध करके फायरबेस प्रमाणीकरण बढ़ाएँ

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

यदि आपने पहचान प्लेटफॉर्म के साथ फायरबेस प्रमाणीकरण में अपग्रेड किया है, तो आप क्लाउड फ़ंक्शंस को अवरुद्ध करके फायरबेस प्रमाणीकरण का विस्तार कर सकते हैं।

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

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

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

अवरोधन कार्यों को समझना

आप दो घटनाओं के लिए अवरुद्ध कार्यों को पंजीकृत कर सकते हैं:

  • पहले बनाएं: किसी नए उपयोगकर्ता को beforeCreate प्रमाणीकरण डेटाबेस में सहेजे जाने से पहले और आपके क्लाइंट ऐप पर टोकन वापस करने से पहले ट्रिगर करता है।

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

ब्लॉकिंग फ़ंक्शंस का उपयोग करते समय निम्नलिखित बातों का ध्यान रखें:

  • आपके फ़ंक्शन को 7 सेकंड के भीतर जवाब देना होगा। 7 सेकंड के बाद, फायरबेस प्रमाणीकरण एक त्रुटि देता है, और क्लाइंट ऑपरेशन विफल हो जाता है।

  • 200 के अलावा अन्य HTTP प्रतिक्रिया कोड आपके क्लाइंट ऐप्स को पास कर दिए जाते हैं। सुनिश्चित करें कि आपका क्लाइंट कोड किसी भी त्रुटि को संभालता है जो आपका फ़ंक्शन वापस कर सकता है।

  • टेनेंट में शामिल किसी भी उपयोगकर्ता सहित, आपके प्रोजेक्ट के सभी उपयोगकर्ताओं पर कार्य लागू होते हैं। फायरबेस प्रमाणीकरण आपके फ़ंक्शन के उपयोगकर्ताओं के बारे में जानकारी प्रदान करता है, जिसमें वे सभी किरायेदार शामिल हैं, ताकि आप तदनुसार प्रतिक्रिया दे सकें।

  • किसी अन्य पहचान प्रदाता को किसी खाते से लिंक करने से पहले से पंजीकृत कोई भी beforeSignIn फ़ंक्शन फिर से ट्रिगर हो जाता है।

  • बेनामी और कस्टम प्रमाणीकरण अवरुद्ध कार्यों को ट्रिगर नहीं करते हैं।

एक अवरुद्ध कार्य को तैनात और पंजीकृत करें

उपयोगकर्ता प्रमाणीकरण प्रवाह में अपना कस्टम कोड डालने के लिए, अवरुद्ध कार्यों को तैनात और पंजीकृत करें। एक बार जब आपके अवरोधन कार्य परिनियोजित और पंजीकृत हो जाते हैं, तो प्रमाणीकरण और उपयोगकर्ता निर्माण के सफल होने के लिए आपका कस्टम कोड सफलतापूर्वक पूरा होना चाहिए।

एक अवरुद्ध कार्य तैनात करें

आप किसी ब्लॉकिंग फ़ंक्शन को उसी तरह परिनियोजित करते हैं जैसे आप किसी फ़ंक्शन को परिनियोजित करते हैं। (विवरण के लिए क्लाउड फ़ंक्शंस प्रारंभ करना पृष्ठ देखें)। सारांश:

  1. क्लाउड फ़ंक्शंस लिखें जो पहले बनाएं ईवेंट, पहले beforeCreate ईवेंट, या दोनों को beforeSignIn हैं।

    उदाहरण के लिए, आरंभ करने के लिए, आप निम्नलिखित नो-ऑप फ़ंक्शन को index.js में जोड़ सकते हैं:

    const functions = require('firebase-functions');
    
    exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
      // TODO
    });
    
    exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
      // TODO
    });
    

    उपरोक्त उदाहरणों ने कस्टम ऑथ लॉजिक के कार्यान्वयन को छोड़ दिया है। विशिष्ट उदाहरणों के लिए अपने अवरोधन कार्यों और सामान्य परिदृश्यों को लागू करने का तरीका जानने के लिए निम्नलिखित अनुभाग देखें।

  2. Firebase CLI का उपयोग करके अपने कार्यों को परिनियोजित करें:

    firebase deploy --only functions
    

    हर बार जब आप उन्हें अपडेट करते हैं तो आपको अपने कार्यों को फिर से तैनात करना होगा।

एक अवरुद्ध कार्य पंजीकृत करें

  1. फायरबेस कंसोल में फायरबेस ऑथेंटिकेशन सेटिंग्स पेज पर जाएं।

  2. ब्लॉकिंग फंक्शन टैब चुनें।

  3. अपने ब्लॉकिंग फ़ंक्शन को ड्रॉपडाउन मेनू से या तो खाता निर्माण से पहले (बनाने से पहले) या साइन इन करने से पहले (साइन इन करने से पहले ) के तहत पंजीकृत करें।

  4. अपने परिवर्तन सहेजें।

उपयोगकर्ता और संदर्भ जानकारी प्राप्त करना

पहले साइनइन और beforeCreate ईवेंट User और beforeSignIn ऑब्जेक्ट्स प्रदान करते हैं EventContext उपयोगकर्ता साइन इन करने के बारे में जानकारी होती है। यह निर्धारित करने के लिए अपने कोड में इन मानों का उपयोग करें कि किसी ऑपरेशन को आगे बढ़ने देना है या नहीं।

User ऑब्जेक्ट पर उपलब्ध गुणों की सूची के लिए, UserRecord API संदर्भ देखें।

EventContext ऑब्जेक्ट में निम्नलिखित गुण हैं:

नाम विवरण उदाहरण
locale एप्लिकेशन लोकेल। आप क्लाइंट एसडीके का उपयोग करके या आरईएसटी एपीआई में लोकेल हेडर पास करके लोकेल सेट कर सकते हैं। fr या sv-SE
ipAddress उस डिवाइस का IP पता जिसे अंतिम उपयोगकर्ता पंजीकृत कर रहा है या जिससे साइन इन कर रहा है। 114.14.200.1
userAgent ब्लॉकिंग फ़ंक्शन को ट्रिगर करने वाला उपयोगकर्ता एजेंट। Mozilla/5.0 (X11; Linux x86_64)
eventId घटना की विशिष्ट पहचानकर्ता। rWsyPtolplG2TBFoOkkgyg
eventType घटना प्रकार। यह ईवेंट के नाम के बारे में जानकारी प्रदान करता है, जैसे कि beforeSignIn साइन इन या beforeCreate , और संबंधित साइन-इन विधि का उपयोग करें, जैसे Google या ईमेल/पासवर्ड। providers/cloud.auth/eventTypes/user.beforeSignIn:password
authType हमेशा USER USER
resource Firebase प्रमाणीकरण प्रोजेक्ट या टैनेंट। projects/ project-id /tenants/ tenant-id
timestamp जिस समय घटना को ट्रिगर किया गया था, उसे RFC 3339 स्ट्रिंग के रूप में स्वरूपित किया गया था। Tue, 23 Jul 2019 21:10:57 GMT
additionalUserInfo एक वस्तु जिसमें उपयोगकर्ता के बारे में जानकारी होती है। AdditionalUserInfo
credential एक वस्तु जिसमें उपयोगकर्ता के क्रेडेंशियल के बारे में जानकारी होती है। AuthCredential

पंजीकरण या साइन-इन अवरुद्ध करना

पंजीकरण या साइन-इन प्रयास को अवरुद्ध करने के लिए, अपने फ़ंक्शन में एक HttpsError । उदाहरण के लिए:

Node.js

throw new functions.auth.HttpsError('permission-denied');

निम्न तालिका उनके डिफ़ॉल्ट त्रुटि संदेश के साथ आपके द्वारा उठाई जा सकने वाली त्रुटियों को सूचीबद्ध करती है:

नाम कोड संदेश
invalid-argument 400 क्लाइंट ने एक अमान्य तर्क निर्दिष्ट किया है।
failed-precondition 400 वर्तमान सिस्टम स्थिति में अनुरोध निष्पादित नहीं किया जा सकता है।
out-of-range 400 क्लाइंट ने एक अमान्य श्रेणी निर्दिष्ट की है।
unauthenticated 401 अनुपलब्ध, अमान्य, या समाप्त हो चुकी OAuth टोकन।
permission-denied 403 क्लाइंट के पास पर्याप्त अनुमति नहीं है।
not-found 404 निर्दिष्ट संसाधन नहीं मिला।
aborted 409 समवर्ती संघर्ष, जैसे कि पठन-संशोधित-लेखन विरोध।
already-exists 409 क्लाइंट ने जिस संसाधन को बनाने का प्रयास किया वह पहले से मौजूद है।
resource-exhausted 429 या तो संसाधन कोटा से बाहर है या सीमित दर तक पहुंच रहा है।
cancelled 499 क्लाइंट द्वारा अनुरोध रद्द कर दिया गया।
data-loss 500 अप्राप्य डेटा हानि या डेटा भ्रष्टाचार।
unknown 500 अज्ञात सर्वर त्रुटि।
internal 500 आंतरिक सर्वर त्रुटि।
not-implemented 501 एपीआई विधि सर्वर द्वारा लागू नहीं की गई।
unavailable 503 सेवा उप्लब्ध् नहीं है।
deadline-exceeded 504 अनुरोध की समय सीमा पार हो गई।

आप एक कस्टम त्रुटि संदेश भी निर्दिष्ट कर सकते हैं:

Node.js

throw new functions.auth.HttpsError('permission-denied', 'Unauthorized request origin!');

निम्न उदाहरण दिखाता है कि किसी विशिष्ट डोमेन में नहीं आने वाले उपयोगकर्ताओं को आपके ऐप के लिए पंजीकरण करने से कैसे रोका जाए:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  // (If the user is authenticating within a tenant context, the tenant ID can be determined from
  // user.tenantId or from context.resource, e.g. 'projects/project-id/tenant/tenant-id-1')

  // Only users of a specific domain can sign up.
  if (user.email.indexOf('@acme.com') === -1) {
    throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

भले ही आप डिफ़ॉल्ट या कस्टम संदेश का उपयोग करें, क्लाउड फ़ंक्शंस त्रुटि को लपेटता है और क्लाइंट को आंतरिक त्रुटि के रूप में लौटाता है। उदाहरण के लिए:

throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email user@evil.com}`);

आपके ऐप को त्रुटि पकड़नी चाहिए, और उसके अनुसार इसे संभालना चाहिए। उदाहरण के लिए:

जावास्क्रिप्ट

// Blocking functions can also be triggered in a multi-tenant context before user creation.
// firebase.auth().tenantId = 'tenant-id-1';
firebase.auth().createUserWithEmailAndPassword('johndoe@example.com', 'password')
  .then((result) => {
    result.user.getIdTokenResult()
  })
  .then((idTokenResult) => {
    console.log(idTokenResult.claim.admin);
  })
  .catch((error) => {
    if (error.code !== 'auth/internal-error' && error.message.indexOf('Cloud Function') !== -1) {
      // Display error.
    } else {
      // Registration succeeds.
    }
  });

उपयोगकर्ता को संशोधित करना

पंजीकरण या साइन-इन प्रयास को अवरुद्ध करने के बजाय, आप ऑपरेशन को जारी रखने की अनुमति दे सकते हैं, लेकिन User ऑब्जेक्ट को संशोधित कर सकते हैं जो फ़ायरबेस प्रमाणीकरण के डेटाबेस में सहेजा गया है और क्लाइंट को वापस कर दिया गया है।

किसी उपयोगकर्ता को संशोधित करने के लिए, अपने ईवेंट हैंडलर से एक ऑब्जेक्ट लौटाएं जिसमें संशोधित करने के लिए फ़ील्ड हों। आप निम्न फ़ील्ड को संशोधित कर सकते हैं:

  • displayName
  • disabled
  • emailVerified
  • photoURL
  • customClaims
  • sessionClaims (केवल beforeSignIn )

sessionClaims के अपवाद के साथ, सभी संशोधित फ़ील्ड फायरबेस ऑथेंटिकेशन के डेटाबेस में सहेजे जाते हैं, जिसका अर्थ है कि वे प्रतिक्रिया टोकन पर शामिल हैं और उपयोगकर्ता सत्रों के बीच बने रहते हैं।

निम्न उदाहरण दिखाता है कि डिफ़ॉल्ट प्रदर्शन नाम कैसे सेट करें:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  return {
    // If no display name is provided, set it to "Guest".
    displayName: user.displayName || 'Guest';
  };
});

यदि आप beforeCreate और beforeSignIn दोनों के लिए ईवेंट हैंडलर पंजीकृत करते हैं, तो ध्यान दें कि beforeSignIn पहले beforeCreate के बाद निष्पादित होता है। पहले beforeSignIn में अपडेट किए गए उपयोगकर्ता फ़ील्ड beforeCreate में दिखाई दे रहे हैं। यदि आप दोनों ईवेंट हैंडलर में sessionClaims के अलावा कोई फ़ील्ड सेट करते हैं, तो पहले साइनइन में सेट किया गया मान beforeSignIn में सेट किए गए मान को अधिलेखित कर beforeCreate है। केवल सत्र sessionClaims के लिए, उन्हें वर्तमान सत्र के टोकन दावों के लिए प्रचारित किया जाता है, लेकिन डेटाबेस में कायम या संग्रहीत नहीं किया जाता है।

उदाहरण के लिए, यदि कोई sessionClaims दावा सेट किया गया है, तो beforeSignIn उन्हें किसी भी beforeCreate के दावों के साथ वापस कर देगा, और उनका विलय कर दिया जाएगा। जब वे मर्ज किए जाते हैं, यदि कोई sessionClaims key customClaims में एक key से मेल खाती है, तो मैचिंग customClaims को sessionClaims key द्वारा टोकन क्लेम में ओवरराइट कर दिया जाएगा। हालांकि, भविष्य के अनुरोधों के लिए डेटाबेस में अधिलेखित customClaims कुंजी अभी भी बनी रहेगी।

समर्थित OAuth क्रेडेंशियल और डेटा

आप OAuth क्रेडेंशियल और डेटा को अलग-अलग पहचान देने वाली कंपनियों के फंक्शन को ब्लॉक करने के लिए पास कर सकते हैं। निम्न तालिका दिखाती है कि प्रत्येक पहचान प्रदाता के लिए कौन से क्रेडेंशियल और डेटा समर्थित हैं:

पहचान प्रदाता आईडी टोकन एक्सेस टोकन समय सीमा समाप्ति समय टोकन सीक्रेट टोकन ताज़ा करें साइन-इन दावे
गूगल हाँ हाँ हाँ नहीं हाँ नहीं
फेसबुक नहीं हाँ हाँ नहीं नहीं नहीं
ट्विटर नहीं हाँ नहीं हाँ नहीं नहीं
GitHub नहीं हाँ नहीं नहीं नहीं नहीं
माइक्रोसॉफ्ट हाँ हाँ हाँ नहीं हाँ नहीं
लिंक्डइन नहीं हाँ हाँ नहीं नहीं नहीं
याहू हाँ हाँ हाँ नहीं हाँ नहीं
सेब हाँ हाँ हाँ नहीं हाँ नहीं
एसएएमएल नहीं नहीं नहीं नहीं नहीं हाँ
ओआईडीसी हाँ हाँ हाँ नहीं हाँ हाँ

टोकन ताज़ा करें

किसी ब्लॉकिंग फ़ंक्शन में रीफ़्रेश टोकन का उपयोग करने के लिए, आपको सबसे पहले Firebase कंसोल के ब्लॉकिंग फ़ंक्शन पृष्ठ पर चेकबॉक्स का चयन करना होगा।

किसी OAuth क्रेडेंशियल के साथ सीधे साइन इन करते समय किसी भी पहचान प्रदाता द्वारा ताज़ा टोकन वापस नहीं किया जाएगा, जैसे कि आईडी टोकन या एक्सेस टोकन। इस स्थिति में, वही क्लाइंट-साइड OAuth क्रेडेंशियल ब्लॉकिंग फ़ंक्शन को पास किया जाएगा।

निम्नलिखित अनुभाग प्रत्येक पहचान प्रदाता प्रकार और उनके समर्थित क्रेडेंशियल और डेटा का वर्णन करते हैं।

सामान्य ओआईडीसी प्रदाता

जब कोई उपयोगकर्ता किसी सामान्य OIDC प्रदाता के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल पास किए जाएंगे:

  • आईडी टोकन : बशर्ते कि id_token प्रवाह चुना गया हो।
  • एक्सेस टोकन : बशर्ते कि कोड प्रवाह चुना गया हो। ध्यान दें कि कोड प्रवाह केवल वर्तमान में REST API द्वारा समर्थित है।
  • टोकन रीफ़्रेश करें : बशर्ते कि offline_access स्कोप चयनित हो।

उदाहरण:

const provider = new firebase.auth.OAuthProvider('oidc.my-provider');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

गूगल

जब कोई उपयोगकर्ता Google के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल पास किए जाएंगे:

  • आईडी टोकन
  • एक्सेस टोकन
  • टोकन रीफ़्रेश करें : केवल तभी प्रदान किया जाता है जब निम्नलिखित कस्टम पैरामीटर का अनुरोध किया जाता है:
    • access_type=offline
    • prompt=consent , यदि उपयोगकर्ता ने पहले सहमति दी थी और कोई नया दायरा अनुरोध नहीं किया गया था

उदाहरण:

const provider = new firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({
  'access_type': 'offline',
  'prompt': 'consent'
});
firebase.auth().signInWithPopup(provider);

Google रीफ़्रेश टोकन के बारे में अधिक जानें।

फेसबुक

जब कोई उपयोगकर्ता Facebook के साथ साइन इन करता है, तो निम्न क्रेडेंशियल पास किया जाएगा:

  • एक्सेस टोकन : एक एक्सेस टोकन वापस कर दिया जाता है जिसे दूसरे एक्सेस टोकन के लिए एक्सचेंज किया जा सकता है। Facebook द्वारा समर्थित विभिन्न प्रकार के एक्सेस टोकन के बारे में और जानें कि आप उन्हें लंबे समय तक चलने वाले टोकन के लिए कैसे एक्सचेंज कर सकते हैं।

GitHub

जब कोई उपयोगकर्ता GitHub के साथ साइन इन करता है, तो निम्न क्रेडेंशियल पास किया जाएगा:

  • एक्सेस टोकन : जब तक निरस्त नहीं किया जाता तब तक समाप्त नहीं होता है।

माइक्रोसॉफ्ट

जब कोई उपयोगकर्ता Microsoft के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल पास किए जाएंगे:

  • आईडी टोकन
  • एक्सेस टोकन
  • टोकन रीफ़्रेश करें : यदि offline_access स्कोप चयनित है, तो ब्लॉकिंग फ़ंक्शन को पास कर दिया गया है।

उदाहरण:

const provider = new firebase.auth.OAuthProvider('microsoft.com');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

याहू

जब कोई उपयोगकर्ता Yahoo के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल बिना किसी कस्टम पैरामीटर या स्कोप के पास कर दिए जाएंगे:

  • आईडी टोकन
  • एक्सेस टोकन
  • टोकन ताज़ा करें

लिंक्डइन

जब कोई उपयोगकर्ता लिंक्डइन के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल पास किया जाएगा:

  • एक्सेस टोकन

सेब

जब कोई उपयोगकर्ता Apple के साथ साइन इन करता है, तो निम्नलिखित क्रेडेंशियल बिना किसी कस्टम पैरामीटर या स्कोप के पास कर दिए जाएंगे:

  • आईडी टोकन
  • एक्सेस टोकन
  • टोकन ताज़ा करें

सामान्य परिदृश्य

निम्नलिखित उदाहरण कार्यों को अवरुद्ध करने के लिए कुछ सामान्य उपयोग के मामलों को प्रदर्शित करते हैं:

केवल एक विशिष्ट डोमेन से पंजीकरण की अनुमति

निम्न उदाहरण दिखाता है कि उन उपयोगकर्ताओं को कैसे रोका जाए जो example.com डोमेन का हिस्सा नहीं हैं, उन्हें आपके ऐप के साथ पंजीकरण करने से रोका जा सकता है:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (!user.email || user.email.indexOf('@example.com') === -1) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

असत्यापित ईमेल वाले उपयोगकर्ताओं को पंजीकरण करने से रोकना

निम्न उदाहरण दिखाता है कि असत्यापित ईमेल वाले उपयोगकर्ताओं को आपके ऐप के साथ पंजीकरण करने से कैसे रोका जाए:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unverified email "${user.email}"`);
  }
});

पंजीकरण पर ईमेल सत्यापन की आवश्यकता

निम्नलिखित उदाहरण दिखाता है कि पंजीकरण के बाद उपयोगकर्ता को अपने ईमेल को सत्यापित करने की आवश्यकता कैसे होती है:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  const locale = context.locale;
  if (user.email && !user.emailVerified) {
    // Send custom email verification on sign-up.
    return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
      return sendCustomVerificationEmail(user.email, link, locale);
    });
  }
});

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
 if (user.email && !user.emailVerified) {
   throw new functions.auth.HttpsError(
     'invalid-argument', `"${user.email}" needs to be verified before access is granted.`);
  }
});

कुछ पहचान प्रदाता ईमेल को सत्यापित मानना

निम्नलिखित उदाहरण दिखाता है कि कुछ पहचान प्रदाताओं के उपयोगकर्ता ईमेल को सत्यापित के रूप में कैसे माना जाए:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified && context.eventType.indexOf(':facebook.com') !== -1) {
    return {
      emailVerified: true,
    };
  }
});

कुछ IP पतों से साइन-इन को ब्लॉक करना

निम्न उदाहरण कुछ IP पते से साइन-इन को कैसे ब्लॉक करता है:

Node.js

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
  if (isSuspiciousIpAddress(context.ipAddress)) {
    throw new functions.auth.HttpsError(
      'permission-denied', 'Unauthorized access!');
  }
});

कस्टम और सत्र दावे सेट करना

निम्नलिखित उदाहरण दिखाता है कि कस्टम और सत्र दावे कैसे सेट करें:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'saml.my-provider-id') {
    return {
      // Employee ID does not change so save in persistent claims (stored in
      // Auth DB).
      customClaims: {
        eid: context.credential.claims.employeeid,
      },
      // Copy role and groups to token claims. These will not be persisted.
      sessionClaims: {
        role: context.credential.claims.role,
        groups: context.credential.claims.groups,
      }
    }
  }
});

संदिग्ध गतिविधि की निगरानी के लिए आईपी पते ट्रैक करना

आप उपयोगकर्ता द्वारा साइन इन किए गए आईपी पते को ट्रैक करके और बाद के अनुरोधों पर आईपी पते से इसकी तुलना करके टोकन चोरी को रोक सकते हैं। यदि अनुरोध संदिग्ध प्रतीत होता है - उदाहरण के लिए, आईपी विभिन्न भौगोलिक क्षेत्रों से हैं - तो आप उपयोगकर्ता को फिर से साइन इन करने के लिए कह सकते हैं।

  1. उपयोगकर्ता द्वारा साइन इन किए गए IP पते को ट्रैक करने के लिए सत्र दावों का उपयोग करें:

    Node.js

    exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
      return {
        sessionClaims: {
          signInIpAddress: context.ipAddress,
        },
      };
    });
    
  2. जब कोई उपयोगकर्ता फायरबेस प्रमाणीकरण के साथ प्रमाणीकरण की आवश्यकता वाले संसाधनों तक पहुंचने का प्रयास करता है, तो साइन इन करने के लिए उपयोग किए गए आईपी के साथ अनुरोध में आईपी पते की तुलना करें:

    Node.js

    app.post('/getRestrictedData', (req, res) => {
      // Get the ID token passed.
      const idToken = req.body.idToken;
      // Verify the ID token, check if revoked and decode its payload.
      admin.auth().verifyIdToken(idToken, true).then((claims) => {
        // Get request IP address
        const requestIpAddress = req.connection.remoteAddress;
        // Get sign-in IP address.
        const signInIpAddress = claims.signInIpAddress;
        // Check if the request IP address origin is suspicious relative to
        // the session IP addresses. The current request timestamp and the
        // auth_time of the ID token can provide additional signals of abuse,
        // especially if the IP address suddenly changed. If there was a sudden
        // geographical change in a short period of time, then it will give
        // stronger signals of possible abuse.
        if (!isSuspiciousIpAddressChange(signInIpAddress, requestIpAddress)) {
          // Suspicious IP address change. Require re-authentication.
          // You can also revoke all user sessions by calling:
          // admin.auth().revokeRefreshTokens(claims.sub).
          res.status(401).send({error: 'Unauthorized access. Please login again!'});
        } else {
          // Access is valid. Try to return data.
          getData(claims).then(data => {
            res.end(JSON.stringify(data);
          }, error => {
            res.status(500).send({ error: 'Server error!' })
          });
        }
      });
    });
    

स्क्रीनिंग उपयोगकर्ता तस्वीरें

निम्न उदाहरण दिखाता है कि उपयोगकर्ताओं की प्रोफ़ाइल फ़ोटो को कैसे साफ़ किया जाए:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.photoURL) {
    return isPhotoAppropriate(user.photoURL)
      .then((status) => {
        if (!status) {
          // Sanitize inappropriate photos by replacing them with guest photos.
          // Users could also be blocked from sign-up, disabled, etc.
          return {
            photoURL: PLACEHOLDER_GUEST_PHOTO_URL,
          };
        }
      });
});

छवियों का पता लगाने और उन्हें साफ करने के तरीके के बारे में अधिक जानने के लिए, क्लाउड विज़न दस्तावेज़ देखें।

उपयोगकर्ता के पहचान प्रदाता OAuth क्रेडेंशियल तक पहुंचना

निम्न उदाहरण दर्शाता है कि Google के साथ साइन इन करने वाले उपयोगकर्ता के लिए रीफ़्रेश टोकन कैसे प्राप्त करें, और इसका उपयोग Google कैलेंडर API को कॉल करने के लिए करें। रीफ्रेश टोकन ऑफ़लाइन पहुंच के लिए संग्रहीत किया जाता है।

Node.js

const {OAuth2Client} = require('google-auth-library');
const {google} = require('googleapis');
// ...
// Initialize Google OAuth client.
const keys = require('./oauth2.keys.json');
const oAuth2Client = new OAuth2Client(
  keys.web.client_id,
  keys.web.client_secret
);

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'google.com') {
    // Store the refresh token for later offline use.
    // These will only be returned if refresh tokens credentials are included
    // (enabled by Cloud console).
    return saveUserRefreshToken(
        user.uid,
        context.credential.refreshToken,
        'google.com'
      )
      .then(() => {
        // Blocking the function is not required. The function can resolve while
        // this operation continues to run in the background.
        return new Promise((resolve, reject) => {
          // For this operation to succeed, the appropriate OAuth scope should be requested
          // on sign in with Google, client-side. In this case:
          // https://www.googleapis.com/auth/calendar
          // You can check granted_scopes from within:
          // context.additionalUserInfo.profile.granted_scopes (space joined list of scopes).

          // Set access token/refresh token.
          oAuth2Client.setCredentials({
            access_token: context.credential.accessToken,
            refresh_token: context.credential.refreshToken,
          });
          const calendar = google.calendar('v3');
          // Setup Onboarding event on user's calendar.
          const event = {/** ... */};
          calendar.events.insert({
            auth: oauth2client,
            calendarId: 'primary',
            resource: event,
          }, (err, event) => {
            // Do not fail. This is a best effort approach.
            resolve();
          });
      });
    })
  }
});