假设我有一个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帐户使用。我从以下观察中得出结论:
My calendars
下。Other calendars
|来访问此类日历时Add a friend´s calendar
和服务帐户的电子邮件地址,我可以发送请求,但它永远不会得到答复(大概是因为服务帐户的电子邮件地址不是“真正的”电子邮件地址) CalendarListEntry#hidden
,因此default false
应该适用。所以我的问题是:如何在普通的Google Calendar Web UI中访问使用Google Calendar API(以及我的案例中的Java客户端)以编程方式创建的日历和日历条目。例如,服务帐户可以与其拥有的Google帐户共享其日历,还是可以直接在UI中使用其服务帐户凭据操纵Google帐户的日历。
我意识到在同一主题上有一些先前的问题,但到目前为止它们并没有帮助我解开这个谜。
答案 0 :(得分:19)
您必须以编程方式共享服务帐户创建的日历。日历归服务帐户所有。
你尝试了什么:
以编程方式与您的帐户共享日历,记录日历唯一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域范围的委派。