Google 服务帐户未获得日历 API 的授权
Google service account not being authorized for calendar API
我正在尝试通过服务帐户连接到我们 G Suite 域中的所有日历。
我创建了一个新项目并在 API 和服务页面中启用了 Google 日历 API。
我创建了一个 Google 服务帐户:
- 一个名字
- 似乎适用的角色
- 生成了json个密钥文件
- 为整个域启用 G Suite
在服务账户管理页面我取了我的ID (AAA@BBB.iam.gserviceaccount.com)
我进入了 G Suite 安全模块并进入了 ManageOauthClients 页面,在那里我输入了 ID 并选择了 google 日历 API (https://www.googleapis.com/auth/calendar)
它正确识别了我的ID并添加了:
1234567890 日历(读写)https://www.googleapis.com/auth/calendar
其中 1234567890 是 Google 从我的 AAA@BBB.iam.gserviceaccount.com 输入中获取的 ID。
现在我为 Google 和日历 API 添加了 nuget 包,并在 C# 的命令行应用程序中编写了以下代码:
var scopes = new[] { CalendarService.Scope.Calendar };
ServiceAccountCredential credential;
using (Stream stream = new FileStream("ToprServiceAccount-xxxxyyyyy.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential = GoogleCredential.FromStream(stream).CreateScoped(scopes).UnderlyingCredential as ServiceAccountCredential;
}
var service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential
});
var list = service.CalendarList.Get("planning@mydomain.com").Execute();
我确定我要求的日历存在。这是我实际执行上述所有步骤时使用的帐户。
但我仍然收到 404 错误,这意味着很可能我没有访问(我自己的)日历的权限。
会不会跟角色有关?我不确定在创建服务帐户时选择什么角色。
同样,当只是试图获取所有日历的列表时,它是一个空列表。
我想说的是检查您是否为 G Suite 中的 ManageOauthClients 部分使用了正确的客户端 ID。服务帐户电子邮件中的 ID 应与您需要使用的客户端 ID 不同。
您可以通过两种方式确认您拥有正确的客户端 ID:
- 转到生成的 JSON 密钥文件。您可以通过查看
client_id
键值对 来获取客户端 ID
- 在 Cloud Console 中,转到 IAM 和管理 -> 服务帐户。最后一列应该是
Options
。如果您为帐户配置了域范围委派 (DwD),您应该单击 View Client ID
,这会将您带到另一个屏幕,您可以在其中查看您的客户端 ID。
我发现出了什么问题(来源:https://neal.codes/blog/google-calendar-api-on-g-suite/)
在 G-Suite -> 应用程序 -> 日历 -> 常规设置中,我必须启用共享所有日历的选项,外人可以更改日历
进入任何日历并与服务帐户电子邮件共享日历后。根据我在问题中的示例,那将是 AAA@BBB.iam.gserviceaccount.com。
这两个步骤据我所知没有在文档中提及。很高兴我现在可以使用它了!
我正在尝试通过服务帐户连接到我们 G Suite 域中的所有日历。
我创建了一个新项目并在 API 和服务页面中启用了 Google 日历 API。
我创建了一个 Google 服务帐户:
- 一个名字
- 似乎适用的角色
- 生成了json个密钥文件
- 为整个域启用 G Suite
在服务账户管理页面我取了我的ID (AAA@BBB.iam.gserviceaccount.com)
我进入了 G Suite 安全模块并进入了 ManageOauthClients 页面,在那里我输入了 ID 并选择了 google 日历 API (https://www.googleapis.com/auth/calendar)
它正确识别了我的ID并添加了:
1234567890 日历(读写)https://www.googleapis.com/auth/calendar
其中 1234567890 是 Google 从我的 AAA@BBB.iam.gserviceaccount.com 输入中获取的 ID。
现在我为 Google 和日历 API 添加了 nuget 包,并在 C# 的命令行应用程序中编写了以下代码:
var scopes = new[] { CalendarService.Scope.Calendar };
ServiceAccountCredential credential;
using (Stream stream = new FileStream("ToprServiceAccount-xxxxyyyyy.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential = GoogleCredential.FromStream(stream).CreateScoped(scopes).UnderlyingCredential as ServiceAccountCredential;
}
var service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential
});
var list = service.CalendarList.Get("planning@mydomain.com").Execute();
我确定我要求的日历存在。这是我实际执行上述所有步骤时使用的帐户。
但我仍然收到 404 错误,这意味着很可能我没有访问(我自己的)日历的权限。
会不会跟角色有关?我不确定在创建服务帐户时选择什么角色。
同样,当只是试图获取所有日历的列表时,它是一个空列表。
我想说的是检查您是否为 G Suite 中的 ManageOauthClients 部分使用了正确的客户端 ID。服务帐户电子邮件中的 ID 应与您需要使用的客户端 ID 不同。
您可以通过两种方式确认您拥有正确的客户端 ID:
- 转到生成的 JSON 密钥文件。您可以通过查看
client_id
键值对 来获取客户端 ID
- 在 Cloud Console 中,转到 IAM 和管理 -> 服务帐户。最后一列应该是
Options
。如果您为帐户配置了域范围委派 (DwD),您应该单击View Client ID
,这会将您带到另一个屏幕,您可以在其中查看您的客户端 ID。
我发现出了什么问题(来源:https://neal.codes/blog/google-calendar-api-on-g-suite/)
在 G-Suite -> 应用程序 -> 日历 -> 常规设置中,我必须启用共享所有日历的选项,外人可以更改日历
进入任何日历并与服务帐户电子邮件共享日历后。根据我在问题中的示例,那将是 AAA@BBB.iam.gserviceaccount.com。
这两个步骤据我所知没有在文档中提及。很高兴我现在可以使用它了!