通过Google日历API创建的日历归谁所有?如何共享这些日历?

25
假设我有一个Google帐户some.account@gmail.com,其中包含项目project-1(在Google Developer Console中配置为Google App Engine应用程序),以及一个使用电子邮件地址12..@developer.gserviceaccount.com的服务帐户属于它。
我知道如何使用此服务帐户编程方式创建日历并对其进行操作:我在我的Google App Engine应用程序中使用Google APIs客户端库(Java版本,带有服务帐户凭据)调用Google Calendar API,它就这样做。但是,任何这样创建的日历似乎都明显归服务帐户所有,而不是归我的englobing Google帐户所有。我从以下观察结果得出这个结论:
  • 当我在Google Calendar UI中查看我的Google帐户日历时,没有任何以编程方式创建的日历显示在My calendars下。
  • 当我尝试通过发布Other calendars | Add a friend´s calendar和使用服务帐户的电子邮件地址来访问这样的日历时,我可以发送请求,但从未得到答复(可能是因为服务帐户的电子邮件地址不是“真实”的电子邮件地址)。
  • 当我以编程方式创建日历时,我不设置CalendarListEntry#hidden,因此应该应用默认值false
所以我的问题是:如何访问使用Google Calendar API(在我的情况下是Java客户端)编程方式创建的日历和日历条目,这些日历和日历条目可以在普通的Google Calendar Web UI中访问。例如,服务帐户是否可以与拥有它的Google帐户共享其日历,或者我是否可以直接使用其服务帐户凭据在UI中操纵Google帐户的日历。
我意识到有一些以前关于同一主题的问题,但它们到目前为止还没有帮助我解决这个谜团。

嗨,我觉得我们在尝试做同样的事情。你能帮忙看一下这个问题吗?当你想要更新多个人的日历时,你会怎么做?http://stackoverflow.com/questions/23469075/is-service-account-in-google-calendar-api-v3-the-replacement-of-domain-consume-k - Jinzhao Huo
@JinzhaoHuo,我现在使用服务帐户(并且是在Java中)可以正常工作了--请参见已接受的答案。如果您有多个人的日历,则可能需要使用多个服务帐户... - Drux
谢谢,但我不这么认为。例如,假设我的公司有100名员工,我必须为他们每个人建立100个服务账户来更新他们的日历?这似乎没有意义。也许我需要为每个员工重新构建Google客户端和日历服务,并让服务账户冒充员工。 - Jinzhao Huo
@JinzhaoHuo 我理解你的观点。然而,由于我不熟悉领域消费密钥的语义,我无法对你链接的问题提供更多帮助。 - Drux
我可以在哪里获取服务账户的日历UI? - Hamza Zafeer
3个回答

20
您需要以编程方式分享由服务帐户创建的日历。这些日历归服务帐户所有。
您尝试过的方法:
- 由于您没有访问权限,即使您是appengine管理员,因此在您的帐户中不会显示这些日历。 - 输入服务帐户的电子邮件地址不会在UI中显示日历,因为服务帐户的电子邮件地址不是日历的电子邮件地址。一个服务帐户可以创建多个日历。
使用编程方式与您的帐户共享日历,记录日历唯一标识符,然后将其输入UI中。

7
那我应该在Google日历API中使用Acl:insert,并将 role 设为 writerscope.type 设为 userscope.value 设为 some.account@gmail.com,对吗? - Drux
3
如果您想完全自由,将自己设置为所有者是最简单的方式。 - koma

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域范围委派。


0

我认为你需要使用PRN参数创建日历(这基本上是将您现有的Google帐户地址伪装成日历“所有者”的身份)

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

如果发现了一个使用prn参数的讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接