繁体   English   中英

无法使用 Node.js 验证谷歌服务帐户

[英]Can't authenticate google service account using Node.js

我的目标是允许人们通过我的网站(目前使用 Firebase)将事件添加到日历中。我试图允许他们将事件添加到服务帐户; 但是,我在验证服务帐户时遇到了问题。 当我尝试部署我的代码时,我在 await 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;
  });

}); 

我一直在关注这两个教程的组合: https : //medium.com/zero-equals-false/integrating-firebase-cloud-functions-with-google-calendar-api-9a5ac042e869 https://dev.to /mornir/create-a-service-account-to-authenticate-with-google-5b1k

我花了很多时间在谷歌上搜索可能出了什么问题,但说实话,这个谷歌身份验证的东西让我很困惑。 我很感激我能得到的任何帮助,谢谢:)

  • 您想使用服务帐户为 Google 日历创建新活动。
  • credentials.json是服务帐户的凭证文件。
  • 您想使用 googleapis 和 Node.js 来实现这一点。
  • 您已经能够使用 Calendar API。

如果我的理解是正确的,这个修改怎么样? 请将此视为几种可能的答案之一。

改装要点:

  • 使用服务帐户时,您可以使用google.auth.JWT而不是google.auth.getClient
  • 在您的脚本中, client被赋予addEvent(eventData, client) 但是在function addEvent(event) {} ,不使用client
  • 关于path.join(__dirname, 'credentials.json'; , )需要添加。 我认为const path = require("path"); 还需要补充。

修改后的脚本:

//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;
    });
});

笔记:

  • 这个修改后的脚本假设request.body的对象可以用于calendar.events.insert() resource
  • TIME_ZONE是否在其他地方声明? 请注意这一点。
  • 当服务帐户的电子邮件未与 Google 电子表格共享时,无法创建事件。 所以请注意这一点。

参考:

如果我误解了您的情况并且这不是您想要的方向,我深表歉意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM