Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Authenticating Sheets request using API key on Node.js application

I'm trying to write to a Sheet document from a Node.js application which responds to a webhook. I'm stuck on the authentication part. I have the following code:

'use strict';

var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');
var request = require('request');
var moment = require('moment');
var mz = require('moment-timezone');
var unirest = require('unirest');

var onfleetWorkersUrl =  "https://onfleet.com/api/v2/workers/";
var sheetsApiKey = 'MY_API_KEY';

function handleGET (req, res) {
  // Do something with the GET request
  res.send(req.query.check);
}

function handlePUT (req, res) {
  // Do something with the PUT request
  res.status(403).send('Forbidden!');
}

function appendNameApiKey(name) {
  var sheets = google.sheets('v4');

  sheets.spreadsheets.values.append({
    auth: sheetsApiKey,
    spreadsheetId: MY_SPREADHSEET_ID,
    range: 'Sheet1!A:A',
    body: {
      "values": [
        [
          name
        ]
      ]
},
  }, function(err, response) {
    if (err) {
      console.log('append request returned an error: ' + err);
      return;
    } else {
      console.log(response);
    }
  });
}

function handleNewTaskPOST (req, res) {

  unirest.get(onfleetWorkersUrl+req.body.workerId)
      .auth(apiKey, "")
      .end(function (response) {
        var driverName = response.body.name;
        var triggerId = req.body.triggerId;
        var timeMilli = req.body.time;
        var driverName = response.body.name;
        var formattedTime = mz.tz(timeMilli, "America/Los_Angeles").format('h:mm a');

        switch (triggerId) {
          case 5:
            console.log('triggerId: 5');
            appendNameApiKey(driverName)
            res.status(200).end();
            break;
          default:
            console.log('Something went wrong.');
            break;
          }
      });
  }

/**
 * Responds to a GET request with "Hello World!". Forbids a PUT request.
 *
 * @example
 * gcloud alpha functions call helloHttp
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.eat24TimesheetCF = function eat24TimesheetCF (req, res) {
  switch (req.method) {
    case 'GET':
      handleGET(req, res);
      break;
    case 'PUT':
      handlePUT(req, res);
      break;
    case 'POST':
      handleNewTaskPOST(req, res);
      break;
    default:
      res.status(500).send({ error: 'Something blew up!' });
      break;
  }
};

This unfortunately returns an error which states that I haven't provided a valid key. Can someone give me some pointers as to how I can authenticate Sheet API request through Node.js using an API key?

like image 683
kevinivan05 Avatar asked Oct 23 '25 17:10

kevinivan05


1 Answers

Not for the API key but for the service account key this solution seems to work (at least for sheets):

const { google } = require('googleapis'); // my fix
let privatekey = require("./privatekey.json");

// configure a JWT auth client
let jwtClient = new google.auth.JWT(
  privatekey.client_email,
  null,
  privatekey.private_key,
  ['https://www.googleapis.com/auth/spreadsheets',
   'https://www.googleapis.com/auth/drive',
   'https://www.googleapis.com/auth/calendar']
);

//authenticate request
jwtClient.authorize(function (err, tokens) {
  if (err) {
    Console.log(err);
    return;
  } else {
    console.log("Successfully connected!");
  }
});

//Google Sheets API
let spreadsheetId = '1Dua_kwZjCZx1pBp_6umDVQYy_t2MT5KfmPf6u7kakcA';
let sheetName = 'Top Rated TV Shows!A5:B10'

let sheets = google.sheets('v4');
sheets.spreadsheets.values.get({
  auth: jwtClient,
  spreadsheetId: spreadsheetId,
  range: sheetName
}, function (err, response) {
  if (err) {
    console.log('The API returned an error: ' + err);
  } else {
    console.log('Movie list from Google Sheets:');
    for (let row of response.data.values) {
      console.log('Title [%s]\t\tRating [%s]', row[0], row[1]);
    }
  }
});

Source: https://isd-soft.com/tech_blog/accessing-google-apis-using-service-account-node-js/

like image 159
alex_1948511 Avatar answered Oct 26 '25 06:10

alex_1948511



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!