Не удается подтвердить подлинность учетной записи службы Google, используя Node.js - PullRequest
1 голос
/ 12 марта 2020

Моя цель - позволить людям добавлять события в календарь через мой веб-сайт (который в настоящее время использует Firebase). Я пытаюсь разрешить им добавлять события в служебную учетную запись; Однако у меня возникли проблемы с аутентификацией учетной записи службы. Когда я пытаюсь развернуть свой код, я получаю сообщение об ошибке «неожиданный токен google» в части 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 сбивает меня с толку. Буду признателен за любую помощь, я могу получить, спасибо:)

1 Ответ

1 голос
/ 12 марта 2020
  • Вы хотите создать новое событие в Календаре 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 может использоваться для resource из calendar.events.insert().
  • Объявлено ли TIME_ZONE в другом месте? Пожалуйста, будьте осторожны.
  • Когда адрес электронной почты учетной записи службы не передается в электронную таблицу Google, событие не может быть создано. Поэтому, пожалуйста, будьте осторожны.

Ссылки:

Если я неправильно понял вашу ситуацию, и это было не то направление, которое вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...