谁拥有服务帐户通过Google Calendar API创建的日历,以及如何共享这些日历?

时间:2014-01-13 14:53:24

标签: google-app-engine google-calendar-api google-account service-accounts

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

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

  • 当我在Google Calendar UI中查看我的Google帐户日历时,所有以编程方式创建的日历都不会显示在My calendars下。
  • 当我尝试通过发出Other calendars |来访问此类日历时Add a friend´s calendar和服务帐户的电子邮件地址,我可以发送请求,但它永远不会得到答复(大概是因为服务帐户的电子邮件地址不是“真正的”电子邮件地址)
  • 当我以编程方式创建日历时,我没有设置CalendarListEntry#hidden,因此default false应该适用。

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

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

3 个答案:

答案 0 :(得分:19)

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

你尝试了什么:

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

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

答案 1 :(得分:0)

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

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

如果使用prn参数找到讨论

答案 2 :(得分:0)

根据(过时的)文档,您必须致电.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域范围的委派。