24

假设我有一个some.account@gmail.com带有项目的 Google 帐户(在 Google Developer Console 中配置为 Google App Engine 应用程序)和一个带有属于它project-1的电子邮件地址的服务帐户。12..@developer.gserviceaccount.com

我知道如何使用此服务帐户创建日历并以编程方式操作其条目:我使用Google API 客户端库(Java 版本,带有服务帐户凭据)在我的 Google App Engine 应用程序中调用 Google 日历 API,它确实如此只是。但是,任何此类创建的日历似乎都由服务帐户拥有,而不是由我的 englobing Google 帐户拥有。我从以下观察得出结论:

  • 当我在Google 日历 UI中查看我的 Google 帐户的日历时,没有任何以编程方式创建的日历显示在My calendars.
  • 当我尝试通过发出Other calendars|访问这样的日历时 Add a friend´s calendar并且使用服务帐户的电子邮件地址,我可以发送请求,但它永远不会得到答复(可能是因为服务帐户的电子邮件地址不是“真实的”电子邮件地址)。
  • 当我以编程方式创建日历时,我没有设置CalendarListEntry#hidden,所以应该应用默认值。false

所以我的问题是:如何在普通的 Google Calendar Web UI 中访问使用 Google Calendar API(在我的情况下是 Java 客户端)以编程方式创建的日历和日历条目。例如,服务帐户是否可以与其拥有的 Google 帐户共享其日历,或者我可以在 UI 中使用其服务帐户凭据直接操作 Google 帐户的日历。

我意识到以前有一些关于同一主题的问题,但到目前为止,它们并没有帮助我解开这个谜团。

4

3 回答 3

20

您必须以编程方式共享服务帐户创建的日历。日历归服务帐户所有。

你尝试了什么:

  • 日历不会显示在您的帐户中,因为您无权访问它们,即使您是 appengine 管理员。
  • 输入服务帐户的电子邮件地址不会在 UI 中显示日历,因为服务帐户的电子邮件地址不是日历的电子邮件地址。一个服务帐户可以创建多个日历。

以编程方式与您的帐户共享日历,记录日历唯一 ID,然后在 UI 中输入。

于 2014-01-13T17:22:53.513 回答
1

根据(过时的)文档,您必须致电.setServiceAccountUser("user@example.com"),该事件将显示在该用户的日历上。

https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests

委派域范围的权限
如果您已委派了对服务帐户的域范围访问,并且您想模拟用户帐户,请使用 GoogleCredential 工厂的 setServiceAccountUser 方法指定用户帐户的电子邮件地址。例如:

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(emailAddress)
    .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
    .setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .setServiceAccountUser("user@example.com")
    .build();

它必须是 GSuite 域的服务帐户,并且您必须启用 GSuite 域范围委派。

于 2018-05-16T17:19:45.740 回答
0

我认为您必须使用 PRN 参数创建日历(这几乎会将您现有的谷歌帐户地址欺骗到日历的“所有者”身份上)

因此,使用 prn 参数将允许您使用服务帐户身份验证来(例如)以您的姓名(谷歌地址)添加事件。

如果找到使用 prn 参数的讨论

于 2014-02-25T10:54:01.177 回答