Кому принадлежат календари, созданные сервисным аккаунтом через Google Calendar API, и как ими можно делиться?

Допустим, у меня есть учетная запись Google [email protected] с проектом project-1 (настроенная как приложение Google App Engine в консоли разработчика Google) и служебная учетная запись с адресом электронной почты [email protected], которая принадлежит ей.

Я знаю, как использовать эту учетную запись службы для создания календаря и программного управления его записями: я использую Клиентская библиотека API Google (версия Java, с учетными данными службы) для вызова API Календаря Google в моем приложении Google App Engine, и он делает именно это. Однако любые такие созданные календари явно принадлежат учетной записи службы, а не моей учетной записи Google. Я заключаю это из следующих наблюдений:

  • Когда я просматриваю календарь своей учетной записи Google в пользовательском интерфейсе Календаря Google, ни один из программно созданных календарей не отображается в My calendars .
  • Когда я пытаюсь получить доступ к такому календарю, выдавая Other calendars | Add a friend´s calendar и с адресом электронной почты учетной записи службы я могу отправить запрос, но на него никогда не будет ответа (предположительно, потому что адрес электронной почты учетной записи службы не является «настоящим» адресом электронной почты).
  • Когда я создаю календари программно, я не устанавливаю CalendarListEntry#hidden, поэтому должно применяться значение по умолчанию false.

Итак, мой вопрос таков: как я могу получить доступ к календарям и записям календаря, которые были созданы программно с помощью Google Calendar API (и клиента Java в моем случае) в обычном веб-интерфейсе Google Calendar. Например, может ли служебная учетная запись делиться своими календарями со своей учетной записью Google, или я могу напрямую управлять календарями учетной записи Google с ее учетными данными в пользовательском интерфейсе.

Я понимаю, что на ту же тему было несколько предыдущих вопросов, но они пока не помогли мне разгадать загадку.


person Drux    schedule 13.01.2014    source источник
comment
привет, я думаю, мы пытаемся делать то же самое. не могли бы вы проверить этот вопрос? Что бы вы сделали, если бы захотели обновить календари нескольких людей? stackoverflow.com/questions/23469075/   -  person Jinzhao Huo    schedule 06.05.2014
comment
@JinzhaoHuo Теперь он работает для меня с учетной записью службы (и в Java) - см. Принятый ответ. Если у вас есть календари нескольких людей, возможно, вам придется использовать несколько учетных записей служб ...   -  person Drux    schedule 06.05.2014
comment
Спасибо, но я так не думаю. Например, предположим, что в моей компании 100 сотрудников, и мне нужно создать 100 учетных записей служб для обновления их календарей? В этом нет смысла. Возможно, мне придется перестроить клиент Google и службу календаря для каждого сотрудника, и учетная запись службы будет выдавать себя за сотрудника.   -  person Jinzhao Huo    schedule 07.05.2014
comment
@JinzhaoHuo Я понимаю вашу точку зрения. Однако, поскольку я не знаком с (семантикой) ключей использования домена, я не могу больше помочь по вашему связанному вопросу.   -  person Drux    schedule 08.05.2014


Ответы (3)


Вам нужно будет программно предоставить общий доступ к календарю, созданному учетной записью службы. Календари принадлежат учетной записи службы.

Что вы пробовали:

  • календари не отображаются в вашей учетной записи, потому что у вас нет права доступа к ним, даже если вы являетесь администратором appengine.
  • ввод адреса электронной почты учетной записи службы не отображает календарь в пользовательском интерфейсе, поскольку адрес электронной почты учетной записи службы не является адресом электронной почты календаря. Одна учетная запись службы может создавать несколько календарей.

Поделитесь календарем программно с вашей учетной записью, зарегистрируйте уникальный идентификатор календаря, а затем введите его в пользовательском интерфейсе.

person koma    schedule 13.01.2014
comment
+1 Поэтому я должен использовать Acl: insert внутри Google Calendar API и установите role, например, на writer, scope.type на user и scope.value на [email protected]? - person Drux; 13.01.2014
comment
да, сделать себя хозяином проще всего, если хочешь полной свободы. - person koma; 14.01.2014

Согласно (устаревшей) документации, вы должны позвонить .setServiceAccountUser("[email protected]"), и событие появится в календаре этого пользователя.

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

Делегирование полномочий на уровне домена
Если вы делегировали доступ на уровне домена учетной записи службы и хотите выдать себя за учетную запись пользователя, укажите адрес электронной почты учетной записи пользователя с помощью метода setServiceAccountUser метода Фабрика GoogleCredential. Например:

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(emailAddress)
    .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
    .setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .setServiceAccountUser("[email protected]")
    .build();

Это должна быть учетная запись службы для домена GSuite, и вы должны включить делегирование GSuite в рамках всего домена.

person Chloe    schedule 16.05.2018

Я думал, вам нужно создать календарь с параметром PRN (который в значительной степени подделывает ваш существующий адрес учетной записи Google на личность "владельца" календаря)

поэтому использование параметра prn позволит вам использовать аутентификацию учетной записи службы для (например) добавления событий на ваше имя (адрес Google).

Если есть обсуждение с использованием параметра prn

person josh.thomson    schedule 25.02.2014