API Календаря Google: как избежать ограничения использования 403 для внутренних гостей домена? - PullRequest
0 голосов
/ 13 февраля 2020

Я использую служебную учетную запись и Google Calendar v3 API для приглашения домена внутренних гостей на мероприятия. Я получаю Encountered 403 Forbidden with reason "quotaExceeded" ошибку. Но из консоли ограничение API не достигается, и ошибка исчезает, когда я прекращаю приглашать гостей.

Проект Google Cloud Platform, в котором находится учетная запись службы, хорошо связан с моим доменом в соответствии с настройками, доступными в консоли Google Cloud Platform, в разделе: API и службы> Проверка домена.

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

Я подумал, что этого будет достаточно, чтобы предотвратить ошибку API из-за приглашений гостей. Я знаю об ограничениях API, перечисленных здесь: https://support.google.com/a/answer/2905486?hl=en, которые, как мне кажется, должны быть в порядке, а именно одно упоминание ограничения на приглашение внешних гостей, , который не является моим случаем .

Но, похоже, я что-то пропустил в настройках, и мои внутренние гости все еще считаются внешними, вы бы посоветовали, как это исправить? Что еще я должен проверить?

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

SERVICE_ACCOUNT_FILE = 'path/to/service_account.json'
SCOPES = [
    'https://www.googleapis.com/auth/calendar.events',
    'https://www.googleapis.com/auth/spreadsheets'
]
credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE,
        scopes=SCOPES
    )
service = discovery.build('calendar', 'v3', credentials=credentials)
service.events().insert(
    calendarId='my_calendar_id',
    body=event_body,
    sendUpdates="none").execute()

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Что ж, похоже, мне не хватало части делегирования пользователей при использовании учетной записи службы. Согласно другому потоку, при использовании делегирования всего домена требуется действовать от имени пользователя: Можно ли вызывать API-интерфейсы из учетной записи службы, не действуя от имени пользователя в делегировании всего домена?

Я обновил свой код следующими строками:

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE,
    scopes=CALENDAR_SCOPES
)
credentials = credentials.with_subject(DOMAIN_USER_EMAIL)
service = discovery.build('calendar', 'v3', credentials=credentials)

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

0 голосов
/ 13 февраля 2020

403 Превышен предел запрещенного использования

Обычно защищает от наводнений. Когда вы делаете запрос к Google API, пользователь может сделать максимум X запросов за 100 секунд. Пользователь обозначается IP-адресом, с которого поступает запрос. Поскольку вы используете учетную запись службы, это сервер, на котором работает ваш код. Вам нужно замедлить работу кода, и если вы получите эту ошибку, просто подождите несколько секунд, а затем повторите тот же запрос.

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

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