Java Google Calendar API access_denied для служебной учетной записи

Я пытаюсь подключиться к календарю с помощью API Java Google Calendar. Java-приложение использует учетную запись службы.

У меня есть следующий код:

   java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12");

   GoogleCredential credential = new GoogleCredential.Builder()

  .setTransport(HTTP_TRANSPORT)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId("[email protected]") 
  .setServiceAccountUser(EMAIL_ADRESS)
  .setServiceAccountScopes(CalendarScopes.CALENDAR)
  .setServiceAccountPrivateKeyFromP12File(licenseFile)
  .build();

  client = new com.google.api.services.calendar.Calendar.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, credential)
                        .setApplicationName("Google Calendar Sync").build();

  Calendar calendar = client.calendars().get(EMAIL_ADRESS).execute();

В последней строке я получаю IOException с сообщением:

ex = (com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "access_denied" }

Я дважды проверил значения для объекта GoogleCredential, и они верны. Я также добавил https://www.google.com/calendar/feeds/, http://www.google.com/calendar/feeds/ в консоли моего домена с идентификатором приложения в качестве клиента, чтобы разрешить доступ к сторонним приложениям.

Я забыл шаг?


person Stephan Celis    schedule 14.12.2012    source источник
comment
Привет, у тебя получилось? Я пытаюсь это сделать с помощью gmail, но получаю ту же ошибку.   -  person zhywu    schedule 09.08.2013
comment
Я обновил ответ;)   -  person Stephan Celis    schedule 09.08.2013
comment
Спасибо, служебная учетная запись не работает для gmail.   -  person zhywu    schedule 14.08.2013
comment
привет, не могли бы вы подсказать мне, как заставить это работать для приложения для Android? я получаю ошибку доступа, не настроенную, и когда я использую этот код, я получаю исключение нулевого указателя при создании учетных данных. Пожалуйста помогите   -  person Rat-a-tat-a-tat Ratatouille    schedule 27.05.2014


Ответы (2)


API еще не готов. В частности, часть служебной учетной записи.

Владелец календаря должен дать приложению разрешение на чтение/запись календаря в его настройках календаря. Он находится в настройках общего доступа календаря, там вы можете добавить адреса электронной почты учетных записей и дать им разрешение на свой календарь.

Поэтому в этом случае мне пришлось добавить: [email protected] в список разрешений/общего доступа к календарям, к которым приложению требовался доступ.

Я также удалил еще один пост, который не работал полностью из-за проблемы, описанной выше. Я восстановлю его, так как он содержит некоторые фрагменты кода, которые могут помочь другим людям в будущем. Но остерегайтесь проблем с разрешениями и учетных записей служб, не поддерживающих Календарь Google.

person Stephan Celis    schedule 09.08.2013
comment
Привет, Стефан. Вы сказали, что учетные записи служб не поддерживают Календарь Google, поэтому не можем ли мы использовать учетную запись службы для получения чьих-либо событий календаря Google, даже если она / он / администратор предоставил нам разрешение? - person Jack; 28.08.2017

я получил его на работу

Не знаю почему, но я удалил строку

.setServiceAccountUser(EMAIL_ADRESS)

Также я добавил дополнительный URL-адрес в область домена:

https://apps-apis.google.com/a/feeds/calendar/resource/#readonly

и удалил неработающую ссылку.

Наконец, я изменил имя приложения в своем клиентском объявлении на то же имя, что и в консоли API.

client = new com.google.api.services.calendar.Calendar.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, credential)
                        .setApplicationName("HolidaySyncs").build();

После этих шагов он начал работать.

Также обратите внимание на будущее, после того как я сделал это, у меня была следующая ошибка:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found"
   }
  ],
  "code": 404,
  "message": "Not Found"
 }
}

Я решил это, изменив, например:

Event result = client.events().insert(<EMAIL ADRESS>, event).execute();

to

Event result = client.events().insert("primary", event).execute();

Сначала я подумал, что что-то не так с серверами Google, но, видимо, что-то идет не так, когда вы пытаетесь сослаться на идентификатор календаря. Таким образом, ссылка на «основной», который является основным календарем учетной записи, работает. Но, согласно документации, это также должно работать, когда вы ссылаетесь на определенный идентификатор календаря, где адрес электронной почты является основным календарем. Наверное баг?

ОБНОВЛЕНИЕ: после исправления кода у меня все еще были проблемы. Прочитайте принятый ответ для получения дополнительной информации.

person Stephan Celis    schedule 18.12.2012