Google 日历 "The request is missing a valid API key" 使用 OAuth 时
Google Calendar "The request is missing a valid API key" when using OAuth
我在数据库中存储了一个 OAuth 令牌,我正在尝试使用它来列出日历的日历事件。我尝试了另一种语言的概念证明,并通过它验证了我的 clientID、clientSecret、redirectURL 和 refreshTokens 都可以正常工作,但由于某些原因,在 Node.js 中我不断收到 The request is missing a valid API key.
错误甚至尽管文档明确指出如果我使用 OAuth 令牌,我不需要使用 API 密钥。
我正在使用 "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({ version: "v3", auth: client })
一样在google.calendar()
处使用auth
的密钥。我认为这就是您的错误消息的原因。
- 此外,关于
}, (res, err) => {
的响应值,第一个参数是错误消息。结果值是第二个参数。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
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);
}
);
注:
- 在此修改中,假设从刷新令牌中检索到的访问令牌可用于从日历中检索事件列表。请注意这一点。
参考:
我在数据库中存储了一个 OAuth 令牌,我正在尝试使用它来列出日历的日历事件。我尝试了另一种语言的概念证明,并通过它验证了我的 clientID、clientSecret、redirectURL 和 refreshTokens 都可以正常工作,但由于某些原因,在 Node.js 中我不断收到 The request is missing a valid API key.
错误甚至尽管文档明确指出如果我使用 OAuth 令牌,我不需要使用 API 密钥。
我正在使用 "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({ version: "v3", auth: client })
一样在google.calendar()
处使用auth
的密钥。我认为这就是您的错误消息的原因。 - 此外,关于
}, (res, err) => {
的响应值,第一个参数是错误消息。结果值是第二个参数。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
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);
}
);
注:
- 在此修改中,假设从刷新令牌中检索到的访问令牌可用于从日历中检索事件列表。请注意这一点。