node.js - 使用 OAuth 时的 Google 日历 "The request is missing a valid API key"

标签 node.js google-oauth google-calendar-api

我在数据库中存储了一个 OAuth token ,我正在尝试使用它来列出日历的日历事件。我尝试了另一种语言的概念验证,并通过它验证了我的 clientID、clientSecret、redirectURL 和 refreshTokens 都正常工作,但由于某种原因,在 Node.js 中我不断收到 The request is Missing a valid API key 。 错误,即使文档明确指出如果我使用 OAuth token ,我就不需要使用 API key 。

我正在使用"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'
  }
]

最佳答案

修改点:

  • 在这种情况下,请在 google.calendar() 中使用 auth key ,例如 google.calendar({ version: "v3", auth:客户端})。我认为这就是您的错误消息的原因。
  • 此外,对于响应值的 }, (res, err) => {,第一个参数是错误消息。结果值是第二个参数。

当以上几点反射(reflect)到您的脚本中时,它会变成如下所示。

修改后的脚本:

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

注意:

  • 在此修改中,假设从刷新 token 检索到的访问 token 可用于从日历中检索事件列表。请小心这一点。

引用:

关于node.js - 使用 OAuth 时的 Google 日历 "The request is missing a valid API key",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65536689/

相关文章:

google-chrome - 使用 Chrome 使用的 Google 用户以外的 Google 用户登录 Chrome 扩展程序

javascript - chrome.identity.getAuthToken : proper error documentation

python - 无需每次身份验证即可使用 Google Api 的任何方法?

google-api - Google Calendar API 同步 token 无效怎么办?

github - GitHub 上的 Oauth 2.0 客户端 key [CLI 应用程序]

node.js - 如何将docker-compose.yml中的环境变量设置为package.json?

node.js - Nodejs 代码重用最佳实践

node.js - 如何使用 Jasmine 访问 Protractor 中执行规范的文件名?

javascript - .forEach() 在 EJS 中不打印任何内容

c# - Google AuthenticatorFactory 替代品?