firebase - फायरबेस के लिए क्लाउड फंक्शन्स में फायरस्टार ट्रिगर से यूजर आईडी प्राप्त करना?




google-cloud-functions google-cloud-firestore (5)

आप उपयोगकर्ता पर getIdToken (): https://firebase.google.com/docs/reference/functions/functions.auth.UserInfo पर कॉल करके वर्तमान साइन-इन किए गए उपयोगकर्ता टोकन प्राप्त कर सकते हैं

उदाहरण bellow में, क्या उपयोगकर्ता का उपयोगकर्ता आईडी (uid) प्राप्त करने का एक तरीका है, जिसने 'ऑफ़र / {ऑफ़रआईड}' को लिखा है? मैं here वर्णित के रूप में करने की कोशिश की, लेकिन यह Firestore में काम नहीं करता है।

exports.onNewOffer = functions.firestore
  .document('offers/{offerId}')
  .onCreate(event => {
    ...
});

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


मैं कुछ समय के लिए इस पर संघर्ष कर रहा था और आखिरकार फायरबेस सपोर्ट से संपर्क किया:

Firestore डेटाबेस ट्रिगर्स के लिए इवेंट ऑब्जेक्ट में event.auth.uid है event.auth.uid । (यह रीयलटाइम डेटाबेस ट्रिगर के लिए काम करता है)

जब मैं console.log(event) हूं, तो मुझे आउटपुट में कोई भी auth नहीं मिल सकता है।

आधिकारिक समर्थन जवाब:

क्षमा करें, फायरस्टार एसडीके में अभी तक ऑर्थर जोड़ा नहीं गया है। हमने इसे अगली विशेषताओं में सूचीबद्ध किया है।

किसी भी अन्य अपडेट के लिए हमारे रिलीज़ नोट्स पर नज़र रखें।

मुझे उम्मीद है कि यह किसी को कुछ घंटे बचाता है।


मैंने इसे कैसे हल किया / इसका हल एक सारांश:

ग्राहक पर

अपने द्वारा creatorId जा रहे निकाय में लॉग इन / वर्तमान उपयोगकर्ता के यूआईडी (जैसे creatorId ) के रूप में creatorId । इस एप्लिकेशन को firebase.auth().onAuthStateChanged() स्टोर करके एक्सेस करें firebase.auth().onAuthStateChanged() आपके ऐप राज्य में उपयोगकर्ता ऑब्जेक्ट।

फायरबेस फायरस्टार / डेटाबेस में

सुरक्षा नियम create लिए एक सुरक्षा नियम जोड़ें जो क्लाइंट-सप्लाई creatorId गए creatorId वैल्यू को प्रमाणित यूजर के यूआईडी के समान हो; अब आप जानते हैं कि क्लाइंट creatorId को creatorId नहीं कर रहा है और इस मूल्य पर कहीं और भरोसा कर सकता है।

जैसे

match /entity/{entityId} {
  allow create: if madeBySelf();
}

function madeBySelf() {
  return request.auth.uid == request.resource.data.creatorId;
}

फायरबेस फंक्शंस में

ग्राहक-आपूर्ति का उपयोग करने के लिए अपनी बनाई गई इकाई प्रकार पर एक onCreate ट्रिगर जोड़ें, और अब उपयोगकर्ता की प्रोफ़ाइल जानकारी बनाने के लिए, और इस जानकारी को नई इकाई डॉक्टर को संलग्न करने के लिए सत्यापित करें, creatorId

इसके द्वारा पूरा किया जा सकता है:

  1. नए खाते बनाए जाने पर users संग्रह और व्यक्तिगत user दस्तावेज़ बनाना, और ऐप-उपयोगी फ़ील्ड (जैसे displayName ) के साथ नए user दस्तावेज़ को पॉप्युलेट करना। यह आवश्यक है क्योंकि फायरबेस प्रमाणीकरण प्रणाली द्वारा उजागर किए गए क्षेत्र उपभोक्ता एप्लिकेशन के उपयोग के लिए अपर्याप्त हैं (जैसे, displayName और avatarURL उजागर नहीं avatarURL जाते हैं) इसलिए आप केवल इस तरह से उपयोगकर्ता की जानकारी देखने पर भरोसा नहीं कर सकते।

    उदाहरण के लिए (ES6 का उपयोग करके)

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'

const APP = admin.initializeApp()

export const createUserRecord = functions.auth.user()
  .onCreate(async (userRecord, context) => {
    const userDoc = {
      id: userRecord.uid,
      displayName: userRecord.displayName || "No Name",
      avatarURL: userRecord.photoURL || '',
    }
    return APP.firestore().collection('users').doc(userRecord.uid).set(userDoc)
  })
  1. अब जब आपके पास एक मान्य creatorId वैल्यू, और उपयोगी user ऑब्जेक्ट हैं, तो अपने user प्रकार (या आपकी सभी बनाई गई creatorId लिए creatorId ट्रिगर जोड़ें, जिससे उपयोगकर्ता की जानकारी बनाई जा सके और उसे बनाई गई वस्तु में जोड़ा जा सके।
export const addCreatorToDatabaseEntry = functions.firestore
  .document('<your entity type here>/{entityId}')
  .onCreate(async (snapshot, context) => {
    const userDoc = await APP.firestore().collection('users').doc(snapshot.data().creatorId).get()
    return snapshot.ref.set({ creator: userDoc.data() }, { merge: true })
})

यह स्पष्ट रूप से आपके पूरे सिस्टम में बहुत सारे डुप्लिकेट किए गए उपयोगकर्ता जानकारी डेटा की ओर जाता है - और आपके द्वारा किए गए क्लीन में थोड़ा सा हो सकता है ('creatorId` उपरोक्त कार्यान्वयन में बनाई गई इकाई पर डुप्लिकेट है) - लेकिन अब यह दिखाना आसान है जिसने आपके पूरे ऐप को बनाया है, और वह 'फायरबेस तरीका' प्रतीत होता है।

उम्मीद है की यह मदद करेगा। मैंने पाया है कि फायरबेस कुछ मायनों में सुपर आश्चर्यजनक है, और कुछ सामान्य रूप से आसान चीजें बनाते हैं (इस तरह) वे जितना कठिन होना चाहिए; संतुलन पर हालांकि मैं एक बड़ा प्रशंसक हूं।


snap._fieldsProto.uid.stringValue बारे में क्या है

उदाहरण:

exports.hello = functions.firestore.document('hello/{worldId}').onCreate((snap, context) => {
   console.log(snap._fieldsProto.uid.stringValue)
});




google-cloud-firestore