Не удается получить доступ к API Календаря Google через учетную запись службы

Я пытаюсь получить свой собственный календарь занятости с помощью простого вызова POST в Java, и я сталкиваюсь с ошибками доступа. В основном я получаю ошибку 404, notFound, например:

{
 "kind": "calendar#freeBusy",
 "timeMin": "2019-05-28T13:00:00.000Z",
 "timeMax": "2019-05-28T21:00:00.000Z",
 "calendars": {
  "[email protected]": {
   "errors": [
    {
     "domain": "global",
     "reason": "notFound"
    }
   ],
   "busy": []
  }
 }
}

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

        ClassLoader classLoader = getClass().getClassLoader();
        File file = new File(Objects.requireNonNull(classLoader.getResource("...a59.json")).getFile());

        GoogleCredential credential = GoogleCredential
                .fromStream(new FileInputStream(file))
                .createScoped(CalendarScopes.all());

        credential.refreshToken();
        String accessToken = credential.getAccessToken();

Значение accessToken, которое я возвращаю, приводит к ответу выше.

Для моей служебной учетной записи я создал ее в рамках проекта, в котором включен API календаря. Я также предоставил ему роль Project Owner, чтобы он имел полный доступ к настройкам в проекте.

Я уверен, что это что-то маленькое и простое с конфигурацией моей учетной записи службы, но я не могу понять, что это такое.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
931
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужен еще один шаг.

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

Откройте файл something-something.json, который вы загрузили при создании учетной записи службы с помощью текстового редактора, и вы найдете адрес электронной почты, необходимый в качестве значения пары ключ/значение «client_email».

Перейдите в свой календарь «Настройки и общий доступ» и нажмите кнопку «+ Добавить людей», которую вы найдете в разделе «Поделиться с определенными людьми».


Вы, вероятно, сделали это, но для других, вот полная процедура доступа к Календарю Google с помощью сервисного аккаунта: (разрешить моему пользователю добавлять встречу в мой календарь с API календаря Google с PHP без аутентификации)

Блестяще!! Это сделало это! Теперь следующий вопрос: как я могу поделиться этим в своей организации? У меня есть права администратора для нашего G Suite, но я не уверен на 100% в настройках.

John S 30.05.2019 22:11

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

Alex Baban 31.05.2019 07:10
Ответ принят как подходящий

Так что мне удалось выяснить это самостоятельно. Кажется, моя учетная запись службы была настроена правильно, но добавленные мной разрешения — нет. Для протокола, вот что я хотел:

  1. Получите доступ только для чтения к календарю.
  2. Иметь возможность получать календарь любого пользователя в моей организации.

Я создал учетную запись службы, убедился, что у нее есть авторизация широкого делегирования домена, добавил API-интерфейсы календаря и администратора в свой проект, который содержит учетную запись службы, но я не мог заставить ее работать без добавления моей учетной записи службы в календарь через @ Сообщение Алекса Бабана выше.

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

Надеюсь, это поможет кому-то еще в будущем.

Другие вопросы по теме

Должен ли я повторно использовать службу для API календаря или безопасно создавать новые по требованию?
Сценарий Google Apps: не удается найти метод createAllDayEvent (строка, строка, объект)
Скрипт приложений для авторизации Google Календаря — автономное веб-приложение
Разрешить моему пользователю добавлять встречу в мой календарь с помощью API календаря Google с PHP без аутентификации
Как добавить минуту к EventdateTime и преобразовать в DateTime
Удаление события календаря Google с помощью python – получение идентификатора события
Неисправность API Google - ImportError: невозможно импортировать имя «сборка»
Как получить все цели и напоминания Календаря Google, которые помечены как ВЫПОЛНЕННЫЕ
Получить данные о дате и времени для календаря, к которому у меня есть доступ только для чтения
Страница аутентификации календаря Google открывается в терминале вместо клиентского браузера