Календарь Google «В запросе отсутствует действительный ключ API» при использовании OAuth

#node.js #google-oauth #google-calendar-api

#node.js #google-oauth #google-calendar-api

Вопрос:

У меня есть токен OAuth, хранящийся в базе данных, и я пытаюсь использовать его для составления списка событий календаря для календаря. Я попробовал подтверждение концепции на другом языке, и благодаря этому я убедился, что все мои ClientID, clientSecret, redirectUrl и refreshTokens работают правильно, но по какой-то причине в Node.js Я продолжаю получать The request is missing a valid API key. сообщение об ошибке, хотя в документации четко указано, что мне не нужно использовать ключ API, если я используюТокен OAuth.

Я использую "googleapis": "^66.0.0"

Есть идеи о том, что я делаю неправильно?

Максимально простой код:

 const { google } = require('googleapis');

const client = new google.auth.OAuth2(clientID, clientSecret, redirectURL);
client.forceRefreshOnFailure = true;

client.setCredentials({
  refresh_token: '<secret>',
});

const service = google.calendar({ version: 'v3', client });
service.events.list({
  calendarId: '<secret>',
  singleEvents: true,
}, (res, err) => {
  console.log(res)
});
 

Сообщение об ошибке:

 config: {
  client: OAuth2Client {
    _events: [Object: null prototype] {},
    _eventsCount: 0,
    _maxListeners: undefined,
    transporter: DefaultTransporter {},
    credentials: {
      refresh_token: '<secret>'
    },
    certificateCache: {},
    certificateExpiry: null,
    certificateCacheFormat: 'PEM',
    refreshTokenPromises: Map(0) {},
    _clientId: '<secret>',
    _clientSecret: '<secret>',
    redirectUri: '<secret>',
    eagerRefreshThresholdMillis: 300000,
    forceRefreshOnFailure: true,
    [Symbol(kCapture)]: false
  },
  url: 'https://www.googleapis.com/calendar/v3/calendars/<secret>/events?singleEvents=true',
  method: 'GET',
  userAgentDirectives: [
    {
      product: 'google-api-nodejs-client',
      version: '4.4.3',
      comment: 'gzip'
    }
  ],
  paramsSerializer: [Function (anonymous)],
  headers: {
    'x-goog-api-client': 'gdcl/4.4.3 gl-node/15.5.0 auth/6.1.3',
    'Accept-Encoding': 'gzip',
    'User-Agent': 'google-api-nodejs-client/4.4.3 (gzip)',
    Accept: 'application/json'
  },
  params: { singleEvents: true },
  validateStatus: [Function (anonymous)],
  retry: true,
  responseType: 'json',
  retryConfig: {
    currentRetryAttempt: 0,
    retry: 3,
    httpMethodsToRetry: [ 'GET', 'HEAD', 'PUT', 'OPTIONS', 'DELETE' ],
    noResponseRetries: 2,
    statusCodesToRetry: [ [ 100, 199 ], [ 429, 429 ], [ 500, 599 ] ]
  }
},
code: 403,
errors: [
  {
    message: 'The request is missing a valid API key.',
    domain: 'global',
    reason: 'forbidden'
  }
]
 

Ответ №1:

Точки модификации:

  • В этом случае, пожалуйста, используйте ключ auth at google.calendar() like google.calendar({ version: "v3", auth: client }) . Я думаю, что это причина вашего сообщения об ошибке.
  • А также, о }, (res, err) => { значениях ответа, 1-й аргумент — это сообщение об ошибке. Результирующее значение является 2-м аргументом.

Когда вышеуказанные пункты отражаются в вашем скрипте, это выглядит следующим образом.

Модифицированный скрипт:

 const service = google.calendar({ version: "v3", auth: client });  // Modified
service.events.list(
  {
    calendarId: '<secret>',
    singleEvents: true,
  },
  (err, res) => {  // Modified
    if (err) {
      console.log(err);
      return;
    }
    console.log(res.data);
  }
);
 

Примечание:

  • В этой модификации предполагается, что токен доступа, полученный из вашего токена обновления, может использоваться для извлечения списка событий из вашего календаря. Пожалуйста, будьте осторожны с этим.

Ссылка:

Комментарии:

1. Спасибо за это. Документация неверна на Node.js страница быстрого запуска. Я просто попросил, чтобы они обновили его. developers.google.com/calendar/api/quickstart/nodejs