मेरे पास Google शीट पर कुछ डेटा है। मैं इस डेटा को एक्सेस करने के लिए Sheets API for Node.js का उपयोग कर रहा हूं। प्रमाणीकरण के लिए, मैं JWTClient उत्पन्न करने के लिए सेवा खाता JSON का उपयोग कर रहा हूं।

मैं शीट एपीआई से डेटा तक पहुंच सकता हूं और सब कुछ ठीक काम कर रहा है। कोड को Google App Engine लचीला वातावरण पर होस्ट किया गया है। यह स्थानीयहोस्ट और जीएई दोनों के लिए ठीक काम करता है।

एकमात्र समस्या यह है कि मुझे प्रमाणीकरण के लिए सेवा खाता कुंजी जेसन प्रदान करने की आवश्यकता है। यह स्थानीय परिवेश में ठीक है, लेकिन ऐप इंजन पर यह सेवा खाते के लिए डिफ़ॉल्ट क्रेडेंशियल प्रदान करता है (मैं उसी सेवा खाते का उपयोग कर रहा हूं)। तो मुझे लगता है कि मुझे मैन्युअल रूप से प्रमाण-पत्र प्रदान नहीं करना चाहिए और जीएई को सर्वर पर प्रमाण-पत्रों का ख्याल रखना चाहिए।

लेकिन यह स्वचालित रूप से प्रमाणित नहीं हो रहा है और अभी भी एक सामान्य पैरामीटर है।

यहाँ शीट्स एपीआई का मेरा वर्तमान कार्यान्वयन है -

const { promisify } = require('util');
const google = require('googleapis');
const auth = require('./auth');
const credentials = require('../configs/credentials');

const sheets = google.sheets('v4');
const getSheetValuesAsync = promisify(sheets.spreadsheets.values.get);
//region private
function readSheet(params) {
  return getSheetValuesAsync(params);
}
//endregion private

//region public
async function get(sheetConfigName) {
  const sheetConfig = credentials.sheets[sheetConfigName];
  //This is theJWTClient which authenticates the api request currently.
  //I want to remove this
  const authClient = await auth.authorizeWithServiceAccount('serviceAccountName', [
    'https://www.googleapis.com/auth/spreadsheets.readonly'
  ]);
  console.log('Client received');
  let params = {
    auth: authClient, //I tried removing this parameter, but it didn't work
    spreadsheetId: sheetConfig.id,
    range: 'A:M'
  };
  let data = await readSheet(params);
  return data;
}
//endregion public
module.exports = {
  get: get
};

मुझे जो त्रुटि मिल रही है वह इस प्रकार है: -

{
  code:403,
  message: 'The request is missing a valid API key.
}

मेरे पास पहले से ही स्थानीय वातावरण के लिए GOOGLE_APPLICATION_CREDENTIALS पर्यावरण चर है जो Google-क्लाउड एपीआई के लिए काम करता है, लेकिन चादरों के लिए काम नहीं कर रहा है।

तो क्या Application Default Credentials सिर्फ google-cloud API के लिए है या इसे शीट्स एपीआई या किसी अन्य ड्राइव एपीआई के साथ इस्तेमाल किया जा सकता है? अगर यह ड्राइव एपीआई के साथ भी काम कर सकता है, तो यह कैसे किया जा सकता है?

5
noob 29 मार्च 2018, 22:20

3 जवाब

सबसे बढ़िया उत्तर

Google के Node.js क्लाइंट पैकेज (28.x) के नवीनतम अपडेट में, उनके पास दूसरे पैकेज की आवश्यकता के बिना authClient प्राप्त करने का एक नया तरीका है। यहां बताया गया है कि यह कैसे किया जाता है -

const { google } = require('googleapis');
  const authClient = await google.auth.getClient({
  credentials: credentials,
  scopes: scopes
});

credentials केवल सेवा खाता JSON ऑब्जेक्ट है। सबसे अच्छी बात यह है कि यदि आप वह संपत्ति प्रदान नहीं करते हैं, तो यह GOOGLE_APPLICATION_CREDENTIALS पर्यावरण चर की जांच करेगा, जिसमें सेवा खाता कुंजी JSON के लिए पूर्ण पथ होगा और प्रमाणीकरण के लिए स्वचालित रूप से इस पर विचार करेगा।
आप निम्न में से किसी एक तरीके का उपयोग करके Google शीट एपीआई के लिए प्रमाणीकरण पैरामीटर सेट करने के लिए जेनरेट किए गए ऑथ क्लाइंट का उपयोग कर सकते हैं -

पहला तब है जब आप अलग-अलग एपीआई कॉल के लिए अलग-अलग ऑथ प्रदान करना चाहते हैं।

const { google } = require('googleapis');
const sheets = google.sheets('v4');
sheets.spreadsheets.values.getAsync = promisify(sheets.spreadsheets.values.get);
sheets.spreadsheets.values.getAsync({
    auth: authClient,
    spreadsheetId: spreadsheetId,
    range: range
  });

या आप सीधे पत्रक वस्तु को प्रमाणीकरण प्रदान कर सकते हैं। उस ऑब्जेक्ट पर सभी API कॉल एक ही authClient का उपयोग करेंगे और उन्हें auth पैरामीटर की आवश्यकता नहीं होगी।

const sheets = google.sheets({version:'v4',auth:authClient);

सबसे अच्छा तरीका यह है कि सभी Google API कॉल के लिए ऑथ को डिफ़ॉल्ट बनाया जाए और फिर आपको किसी भी शीट ऑब्जेक्ट या API कॉल के लिए authClient को पास नहीं करना पड़ेगा।

google.options({
  auth: authClient
});

यदि आप अलग-अलग एपीआई के लिए अलग-अलग सेवा खातों का उपयोग करने की योजना बना रहे हैं, तो आप अभी भी शीट (या ड्राइव या किसी अन्य ऑब्जेक्ट) एपीआई ऑब्जेक्ट या किसी भी एपीआई कॉल में ऑथ पैरामीटर को ओवरराइड कर सकते हैं।

स्थानीय में परीक्षण के लिए आप हमेशा पर्यावरण पथ सेट कर सकते हैं, ताकि आपको वास्तव में सेवा खाते को google.auth ऑब्जेक्ट में पास न करना पड़े। यहां बताया गया है कि मैंने इसे कैसे किया

let resolve = require('path').resolve;
if (process.env.NODE_ENV === 'production') {
  //Set config based on production environment. It won't be set in local environment, unless you specially set it.
} else if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) {
  process.env.GOOGLE_APPLICATION_CREDENTIALS = resolve(
      './relative/path/to/the/json/key.json'
  ); //resolve will just convert relative path to the absolute path.
}
0
noob 26 अप्रैल 2018, 04:40

Google क्लाउड सेवा खाते क्लाउड एपीआई तक पहुंचने के लिए हैं और शीट्स एपीआई के लिए उपयुक्त दायरा नहीं दिया जा सकता है।

चूंकि ऐप इंजन फ्लेक्सिबल एप्लिकेशन कंप्यूट इंजन वीएम पर चलते हैं, इसलिए आप मेटाडेटा सर्वर को क्वेरी करके डिफ़ॉल्ट सेवा खाते के लिए टोकन प्राप्त कर सकते हैं:

> curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"

हालांकि, उस टोकन को प्रदान करने वाले शीट्स एपीआई को कॉल करते समय, यह निम्न त्रुटि देता है:

{
  "error": {
    "code": 403,
    "message": "Request had insufficient authentication scopes.",
    "status": "PERMISSION_DENIED"
  }
}

मेरा मानना ​​​​है कि आपको अपने उपयोग के मामले में एपीआई कुंजी का उपयोग करना होगा।

1
LundinCast 31 मार्च 2018, 15:25

अगर आप Google पत्रक API का उपयोग करना चाहते हैं, तो आपको दस्तावेज़ीकरण. डिफ़ॉल्ट सेवा खाता ज्यादातर GCP (Google क्लाउड प्लेटफ़ॉर्म) के भीतर से डेटा खींचते समय उपयोग करने के लिए डिज़ाइन किया गया है। तो आपका कंप्यूट इंजन आपके क्लाउड डेटास्टोर तक पहुंच सकता है या यदि आपका ऐप इंजन आपके क्लाउड स्टोरेज तक पहुंच सकता है।

डिफ़ॉल्ट सेवा खाते में क्लाइंट सीक्रेट JSON नहीं होता है, जिसकी शीट API को आवश्यकता होती है।

वैकल्पिक रूप से, यदि आप Google पत्रक का उपयोग करना चाहते हैं, तो आप सार्वजनिक दस्तावेज़ों के लिए API कुंजी का उपयोग कर सकते हैं बाकी एपीआई.

1
Ying Li 30 मार्च 2018, 18:12