javascript आने वाली JSON ऑब्जेक्ट में एक client_email फ़ील्ड नहीं है




firebase google-cloud-functions (4)

आपको शायद Firebase एमुलेटर का उपयोग करने के लिए Firebase Admin SDK को सेट करना होगा। जब आप admin.initializeApp() विधि को कॉल कर एक credential प्रॉपर्टी पास कर सकते हैं:

const serviceAccount = require('../serviceAccount.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

आप अपने सर्विस अकाउंट JSON फाइल को फायरबेस कंसोल में डाउनलोड कर सकते हैं:

  • "सेटिंग" आइकन पर क्लिक करें;
  • "उपयोगकर्ता और अनुमतियां" पर जाएं;
  • उस लिंक पर क्लिक करें जहां यह कहता है कि "एन सेवा खातों की भी इस परियोजना तक पहुंच है";
  • "नई निजी कुंजी उत्पन्न करें" बटन पर क्लिक करें।

मैं एक फायरबेस क्लाउड फ़ंक्शन बनाने की कोशिश कर रहा हूं। इसलिए मैं अपने फायरबेस क्लाउड फंक्शन को स्थानीय स्तर पर चलाना चाहूंगा। लेकिन यह कैसे प्रमाणीकरण स्थापित करने के लिए काम नहीं करता है।

मैंने फायरबेस उपकरण स्थापित किए हैं: https://firebase.google.com/docs/functions/local-emulator मैंने कमांड firebase login , इसलिए अब मैं लॉग इन हूं। फिर मैंने इस ट्यूटोरियल के साथ अपनी json कुंजी बनाई: https://cloud.google.com/docs/authentication/getting-started अब अगर मैं echo $GOOGLE_APPLICATION_CREDENTIALS टाइप करता हूं तो परिणाम / /home/$USER/.google/****.json जिसमें सम्‍मिलित है

"project_id","private_key_id","private_key","client_email", "client_id",  "auth_uri", "token_uri", "auth_provider_x509_cert_url", "client_x509_cert_url"

इसके अलावा मैंने पूर्ण Google क्लाउड एसडीके को स्थापित करने की कोशिश की है और मैंने भाग लिया है: gcloud auth application-default login लेकिन कोई सफलता नहीं।

Npm पैकेज संस्करण:

"firebase-functions":"3.0.2"
"firebase-admin": "8.2.0"

मुझे लगता है कि मैंने पर्याप्त जानकारी प्रदान की है, लेकिन यदि आप चाहें तो मुझसे और अधिक पूछने के लिए स्वतंत्र महसूस करें।

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
admin.firestore().collection('something').get().then((collection) =>
    return res.send({"count": collection.docs.length, "status": 200});
});
exports.exports = functions.https.onRequest(app);

कोड महत्वपूर्ण नहीं है, सबसे महत्वपूर्ण बात यह है कि यहां तक ​​कि मैंने सभी शोध चरण किए हैं, जब मैं फायरबेस के साथ स्थानीय रूप से अपने फायरबेस का अनुकरण करता हूं और मैं एक फ़ंक्शन को ट्रिगर करता हूं, तो मुझे यह त्रुटि है: त्रुटि: आने वाली JSON ऑब्जेक्ट में शामिल नहीं है एक client_email फ़ील्ड

मैं आपको यह सुनिश्चित कर सकता हूं कि json फ़ाइल में client_email फ़ील्ड है।

क्या आप मुझे Google के साथ प्रमाणित करने में सहायता कर सकते हैं?

आपकी सहायता के लिए धन्यवाद।


संक्षेप में:

admin.initializeApp({ credential: admin.credential.applicationDefault() });

admin.credential.applicationDefault() लिए डॉक्स देखें

थोड़ी और जानकारी

मेरे पास स्थानीय स्तर पर फायरबेस फ़ंक्शन को कॉल करने की कोशिश करते समय ऐसा ही था जो बैच में फायरस्टार डेटाबेस में कुछ दस्तावेजों को अपडेट करने की कोशिश करता है। (बैच के बिना परीक्षण नहीं किया गया था)।

स्थानीय स्तर पर फायरबेस फ़ंक्शन को कॉल करना शुरू करने के लिए, मैं उपयोग करता हूं:

firebase function:shell

जैसा कि आप शायद जानते हैं, यह आपके प्रोजेक्ट के लिए उपलब्ध कार्यों को सूचीबद्ध करता है।

मैंने अपने फ़ंक्शन को कॉल किया और निम्न त्रुटि कॉलस्टैक प्राप्त की:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

मैं कमांड लाइन का उपयोग करके स्थानीय रूप से अपना फ़ंक्शन चला रहा था: firebase functions:shell

मैं इस कोड का उपयोग कर रहा था:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

मैंने लाइन बदल दी

admin.initializeApp();

सेवा मेरे

admin.initializeApp({ credential: admin.credential.applicationDefault() });

और अब मैं स्थानीय रूप से अपने फ़ंक्शन को कॉल करने में सक्षम था:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

admin.credential.applicationDefault() लिए डॉक्स देखें


एक बार जब आप फायरबेस परियोजना बना लेते हैं, तो आप एसडीके को एक प्राधिकरण रणनीति के साथ आरंभ कर सकते हैं जो आपकी सेवा खाता फ़ाइल को Google अनुप्रयोग डिफ़ॉल्ट क्रेडेंशियल के साथ जोड़ती है।

एक सेवा खाते को प्रमाणित करने और फायरबेस सेवाओं तक पहुंचने के लिए इसे अधिकृत करने के लिए, आपको JSON प्रारूप में एक निजी कुंजी फ़ाइल बनानी होगी।

अपने सेवा खाते के लिए एक निजी कुंजी फ़ाइल उत्पन्न करने के लिए:

  1. Firebase कंसोल में, सेटिंग्स> सेवा खाते खोलें।

  2. Generate New Private Key पर क्लिक करें, फिर Generate Key पर क्लिक करके पुष्टि करें।

  3. JSON फ़ाइल को कुंजी से सुरक्षित रूप से संग्रहीत करें।

JSON फ़ाइल के फ़ाइल पथ में वातावरण चर GOOGLE_APPLICATION_CREDENTIALS सेट करें जिसमें आपका खाता खाता कुंजी हो। यह चर केवल आपके वर्तमान शेल सत्र पर लागू होता है, इसलिए यदि आप एक नया सत्र खोलते हैं, तो चर को फिर से सेट करें।

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

https://firebase.google.com/docs/admin/setup?authuser=3


firebase emulators:start चलाते समय मुझे यह त्रुटि हो रही थी firebase emulators:start

इस बग से जांच के अनुसार: github.com/firebase/firebase-tools/issues/1451 , ऐसा लगता है कि यह व्यवस्थापक मॉड्यूल के बजाय सीधे ऐप को संदर्भित करने के साथ एक समस्या है।

इसका कारण त्रुटि है:

const app = admin.initializeApp();
const firestore = app.firestore();

लेकिन यह नहीं है:

admin.initializeApp();
const firestore = admin.firestore();

हालांकि मूल प्रश्न के लिए, आप admin.firestore () का उपयोग कर रहे हैं ताकि समस्या न हो। ऐसा लगता है कि admin.initializeApp() कभी नहीं कहा जाता है। शायद यह आपके मुद्दे का कारण हो सकता है?







google-auth-library