Google 服务帐户无法列出日历?
Google service account unable to list calendars?
任何人都可以指出允许服务帐户访问 Google 日历的正确设置吗?
我们有一个 node.js 项目,旨在提供对它已被授予访问权限的 Google 日历的访问权限,但我们无法弄清楚为什么它看不到日历.
与此同时,我们能够尝试使用另一个在另一个环境中工作的不同帐户,这很有效,但问题是以前在该项目上工作的人都无法访问该项目的配置比较。
我们得到的问题帐户 response.data
:
{
"kind": "calendar#calendarList",
"etag": "\"p33k9lxxjsrxxa0g\"",
"nextSyncToken": "COias9Pm4vUCEjxvdGurdXRob24tZGV2LXNlcnZpY2UxQG90YxxxdGhvbi1kZXYuaWFtLmdzZXJ2aWNlYWNxb3VudC5jb20=",
"items": []
}
无论哪种方式,这都表明问题出在服务帐户的配置上,而不是代码本身,但无论如何都会共享代码:
import { Auth, calendar_v3 as calendarV3 } from 'googleapis';
const Calendar = calendarV3.Calendar;
async getCalendarApi () {
const jwtClient = new Auth.JWT(
this.keyConfig.clientEmail,
undefined,
this.keyConfig.privateKey.replace(/\n/g, '\n'),
[
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
);
const calendarApi = new Calendar({
auth: jwtClient
});
await jwtClient.authorize();
return calendarApi;
}
async init () {
// loads the configuration from our app's configuration file
this.keyConfig = getKeyConfig('google-calendar');
const calendarApi = await this.getCalendarApi();
const response = await calendarApi.calendarList.list();
console.log(JSON.stringify(response.data, undefined, 2));
}
至于服务帐户,在 Google 控制台中,它是这样设置的:
- 打开https://console.cloud.google.com/
- Select 顶部的相应项目
- 在搜索栏中搜索 'Google Calendar API'
- 验证它已启用
- 单击 'Manage',这会将我带到 https://console.cloud.google.com/apis/api/calendar-json.googleapis.com/metrics?project=xxxxxx('xxxxxx' 是项目 ID,但在此处被屏蔽)
- 点击“凭据”
- 单击顶部的 'Create Credentials' 和 select 'service account'
- 提供服务帐户的名称
- 点击'Create and Continue'
- 添加角色:基本 -> 查看者
- 点击'Done'
- 在 'Credentials' 页面 (https://console.cloud.google.com/apis/credentials?project=xxxxxx) 中点击编辑我们刚刚创建的帐户
- 在 'keys' 部分:添加密钥 -> 创建新密钥,然后指定 JSON
通过上述步骤,我们将 client_email
和 private_key
字段值提供给我们的 nodejs 应用程序的用户。
然后在我们希望它访问的日历中,我们将服务帐户的电子邮件地址添加为查看者。
尝试以上所有方法仍然会导致服务帐户可见的日历列表为空。
有什么想法吗?
根据您的解释和返回值,我担心在您的情况下,您可能从未使用服务帐户插入共享日历。如果我的理解是正确的,下面的修改怎么样?
修改点:
将共享日历插入服务帐户。
这种情况下,请将范围https://www.googleapis.com/auth/calendar.readonly
修改为https://www.googleapis.com/auth/calendar
。
async init () {
// loads the configuration from our app's configuration file
this.keyConfig = getKeyConfig('google-calendar');
const calendarApi = await this.getCalendarApi();
const response = await calendarApi.calendarList.insert({resource: {id: "###@group.calendar.google.com"}}); // Please set the Calendar ID here. Or {requestBody: {id: "###@group.calendar.google.com"}}
console.log(JSON.stringify(response.data, undefined, 2));
}
使用您的脚本检索日历列表。
- 使用上述脚本将日历插入服务账号后,即可在日历列表中获取到共享日历。
参考:
任何人都可以指出允许服务帐户访问 Google 日历的正确设置吗?
我们有一个 node.js 项目,旨在提供对它已被授予访问权限的 Google 日历的访问权限,但我们无法弄清楚为什么它看不到日历.
与此同时,我们能够尝试使用另一个在另一个环境中工作的不同帐户,这很有效,但问题是以前在该项目上工作的人都无法访问该项目的配置比较。
我们得到的问题帐户 response.data
:
{
"kind": "calendar#calendarList",
"etag": "\"p33k9lxxjsrxxa0g\"",
"nextSyncToken": "COias9Pm4vUCEjxvdGurdXRob24tZGV2LXNlcnZpY2UxQG90YxxxdGhvbi1kZXYuaWFtLmdzZXJ2aWNlYWNxb3VudC5jb20=",
"items": []
}
无论哪种方式,这都表明问题出在服务帐户的配置上,而不是代码本身,但无论如何都会共享代码:
import { Auth, calendar_v3 as calendarV3 } from 'googleapis';
const Calendar = calendarV3.Calendar;
async getCalendarApi () {
const jwtClient = new Auth.JWT(
this.keyConfig.clientEmail,
undefined,
this.keyConfig.privateKey.replace(/\n/g, '\n'),
[
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
);
const calendarApi = new Calendar({
auth: jwtClient
});
await jwtClient.authorize();
return calendarApi;
}
async init () {
// loads the configuration from our app's configuration file
this.keyConfig = getKeyConfig('google-calendar');
const calendarApi = await this.getCalendarApi();
const response = await calendarApi.calendarList.list();
console.log(JSON.stringify(response.data, undefined, 2));
}
至于服务帐户,在 Google 控制台中,它是这样设置的:
- 打开https://console.cloud.google.com/
- Select 顶部的相应项目
- 在搜索栏中搜索 'Google Calendar API'
- 验证它已启用
- 单击 'Manage',这会将我带到 https://console.cloud.google.com/apis/api/calendar-json.googleapis.com/metrics?project=xxxxxx('xxxxxx' 是项目 ID,但在此处被屏蔽)
- 点击“凭据”
- 单击顶部的 'Create Credentials' 和 select 'service account'
- 提供服务帐户的名称
- 点击'Create and Continue'
- 添加角色:基本 -> 查看者
- 点击'Done'
- 在 'Credentials' 页面 (https://console.cloud.google.com/apis/credentials?project=xxxxxx) 中点击编辑我们刚刚创建的帐户
- 在 'keys' 部分:添加密钥 -> 创建新密钥,然后指定 JSON
通过上述步骤,我们将 client_email
和 private_key
字段值提供给我们的 nodejs 应用程序的用户。
然后在我们希望它访问的日历中,我们将服务帐户的电子邮件地址添加为查看者。
尝试以上所有方法仍然会导致服务帐户可见的日历列表为空。
有什么想法吗?
根据您的解释和返回值,我担心在您的情况下,您可能从未使用服务帐户插入共享日历。如果我的理解是正确的,下面的修改怎么样?
修改点:
将共享日历插入服务帐户。
这种情况下,请将范围
https://www.googleapis.com/auth/calendar.readonly
修改为https://www.googleapis.com/auth/calendar
。async init () { // loads the configuration from our app's configuration file this.keyConfig = getKeyConfig('google-calendar'); const calendarApi = await this.getCalendarApi(); const response = await calendarApi.calendarList.insert({resource: {id: "###@group.calendar.google.com"}}); // Please set the Calendar ID here. Or {requestBody: {id: "###@group.calendar.google.com"}} console.log(JSON.stringify(response.data, undefined, 2)); }
使用您的脚本检索日历列表。
- 使用上述脚本将日历插入服务账号后,即可在日历列表中获取到共享日历。