Can';t使用Node.js验证google服务帐户

Can';t使用Node.js验证google服务帐户,node.js,google-calendar-api,service-accounts,Node.js,Google Calendar Api,Service Accounts,我的目标是允许人们通过我的网站(目前使用Firebase)将事件添加到日历中。我正在尝试允许他们将事件添加到服务帐户中;但是,我在获取服务帐户身份验证时遇到问题。当我尝试部署代码时,我在wait google.auth.getClient部分得到一个“意外的标记google”错误。我在全球安装了谷歌API工具 //ADD CALENDAR EVENT const {google} = require('googleapis'); const calendar = google.calendar(

我的目标是允许人们通过我的网站(目前使用Firebase)将事件添加到日历中。我正在尝试允许他们将事件添加到服务帐户中;但是,我在获取服务帐户身份验证时遇到问题。当我尝试部署代码时,我在wait google.auth.getClient部分得到一个“意外的标记google”错误。我在全球安装了谷歌API工具

//ADD CALENDAR EVENT
const {google} = require('googleapis');
const calendar = google.calendar('v3');

//Authenticate Service Acounnt
function getCredentials() {
  const filePath = path.join(__dirname, 'credentials.json';
  if (fs.existsSync(filePath)) {
    return require(filePath)
  }
  if (process.env.CREDENTIALS) {
    return JSON.parse(process.env.CREDENTIALS)
  }
  throw new Error('Unable to load credentials')
}

//Create Calendar Event
function addEvent(event) {
  return new Promise(function(resolve, reject) {
      calendar.events.insert({
          calendarId: 'primary',
          resource: {
              'summary': event.eventName,
              'description': event.description,
              'start': {
                  'dateTime': event.startTime,
                  'timeZone': TIME_ZONE,
              },
              'end': {
                  'dateTime': event.endTime,
                  'timeZone': TIME_ZONE,
              },
          },
      }, (err, res) => {
          if (err) {
              console.log('Rejecting because of error');
              reject(err);
          }
          console.log('Request successful');
          resolve(res.data);
      });
  });
}

//Add Event To Service Acount 
exports.addEventToCalendar = functions.https.onRequest((request, response) => {

  const eventData = {
      eventName: request.body.eventName,
      description: request.body.description,
      startTime: request.body.startTime,
      endTime: request.body.endTime
  }; 

  const credentials = getCredentials();
  const client = await google.auth.getClient({
    credentials,
    scopes: 'https://www.googleapis.com/auth/calendar',
  }) 

  addEvent(eventData, client).then(data => {
      response.status(200).send(data);
      return;
  }).catch(err => {
      console.error('Error adding event: ' + err.message); 
      response.status(500).send(ERROR_RESPONSE); 
      return;
  });

}); 
我一直在关注这两个教程的组合:

我花了很多时间在谷歌上搜索可能出错的地方,但老实说,谷歌认证的东西把我弄糊涂了。如果能得到任何帮助,我将不胜感激,谢谢:)

  • 您希望使用服务帐户在Google日历中创建新事件
  • credentials.json
    是服务帐户的凭据文件
  • 您希望通过Node.js使用googleapis实现这一点
  • 您已经能够使用日历API
如果我的理解是正确的,这次修改怎么样?请把这看作是几个可能的答案之一

修改点:
  • 使用服务帐户时,可以使用
    google.auth.JWT
    而不是
    google.auth.getClient
  • 在脚本中,
    client
    被赋予
    addEvent(eventData,client)
    。但是在
    函数addEvent(event){}
    中,不使用
    客户端
  • 关于
    路径。需要添加join(uu dirname,'credentials.json';
    。我认为
    constpath=require(“path”)
修改脚本: 注:
  • 此修改的脚本假定
    request.body
    的对象可用于
    calendar.events.insert()的
    resource
  • 时区是否在别处声明?请小心这个
  • 如果服务帐户的电子邮件未与Google电子表格共享,则无法创建事件。所以请小心这个
参考资料:

如果我误解了你的情况,而这不是你想要的方向,我道歉。

哇!这真的很有帮助!我不知道我可以使用JWT客户端。非常感谢;“我真的很感激你的回答。”卡特西谢谢你的回答。我很高兴你的问题解决了。
//ADD CALENDAR EVENT
const { google } = require("googleapis");
const path = require("path");  // Added

// --- I added below script.
const key = require(path.join(__dirname, 'credentials.json'));
const jwtClient = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ["https://www.googleapis.com/auth/calendar"],
  null
);
const calendar = google.calendar({ version: "v3", auth: jwtClient });
// ---

//Create Calendar Event
function addEvent(event) {
  return new Promise(function(resolve, reject) {
    calendar.events.insert(
      {
        calendarId: "primary",
        resource: {
          summary: event.eventName,
          description: event.description,
          start: {
            dateTime: event.startTime,
            timeZone: TIME_ZONE
          },
          end: {
            dateTime: event.endTime,
            timeZone: TIME_ZONE
          }
        }
      },
      (err, res) => {
        if (err) {
          console.log("Rejecting because of error");
          reject(err);
          return;
        }
        console.log("Request successful");
        resolve(res.data);
      }
    );
  });
}

//Add Event To Service Acount
exports.addEventToCalendar = functions.https.onRequest((request, response) => {
  const eventData = {
    eventName: request.body.eventName,
    description: request.body.description,
    startTime: request.body.startTime,
    endTime: request.body.endTime
  };

  addEvent(eventData) // Modified
    .then(data => {
      response.status(200).send(data);
      return;
    })
    .catch(err => {
      console.error("Error adding event: " + err.message);
      response.status(500).send(ERROR_RESPONSE);
      return;
    });
});