Google Calendar API : 如何避免域内部访客的 403 使用限制?
Google Calendar API : How to avoid 403 usage limit for domain internal guests?
我正在使用服务帐户和 Google 日历 v3 API 邀请域 内部 来宾参加活动。我收到 Encountered 403 Forbidden with reason "quotaExceeded"
错误。但是,在控制台中,没有达到 API 限制,当我停止邀请来宾时错误消失。
根据 Google 云平台控制台中可用的设置,持有服务帐户的 Google 云平台项目 与我的域 密切相关,在以下部分: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()
403 Forbidden Usage Limit Exceeded
正常防洪。当您针对 Google API 发出请求时,用户每 100 秒最多可以发出 X 次请求。用户由请求来自的 IP 地址表示。当您使用服务帐户时,它是您的代码所在的服务器 运行。您需要放慢代码速度,如果确实收到此错误,只需等待几秒钟,然后再次发出相同的请求。
如果您代表另一个用户执行这些操作,那么您可以尝试将 QuotaUser 参数添加到您的所有请求中,表示这实际上是一个不同的用户。这有时会有所帮助,但它不是万无一失的,我一直试图向它发送一个随机数,最终 google 发现了,我开始收到那个错误。
好吧,我似乎在使用服务帐户时遗漏了用户授权部分。
根据另一个线程,在使用域范围委托时需要代表用户行事:
我已经用以下几行更新了我的代码:
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)
不再达到阻止插入有与会者的事件的限制。尽管域验证和全域委托,但没有用户委托的服务帐户未被识别为我的域内部。
我正在使用服务帐户和 Google 日历 v3 API 邀请域 内部 来宾参加活动。我收到 Encountered 403 Forbidden with reason "quotaExceeded"
错误。但是,在控制台中,没有达到 API 限制,当我停止邀请来宾时错误消失。
根据 Google 云平台控制台中可用的设置,持有服务帐户的 Google 云平台项目 与我的域 密切相关,在以下部分: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()
403 Forbidden Usage Limit Exceeded
正常防洪。当您针对 Google API 发出请求时,用户每 100 秒最多可以发出 X 次请求。用户由请求来自的 IP 地址表示。当您使用服务帐户时,它是您的代码所在的服务器 运行。您需要放慢代码速度,如果确实收到此错误,只需等待几秒钟,然后再次发出相同的请求。
如果您代表另一个用户执行这些操作,那么您可以尝试将 QuotaUser 参数添加到您的所有请求中,表示这实际上是一个不同的用户。这有时会有所帮助,但它不是万无一失的,我一直试图向它发送一个随机数,最终 google 发现了,我开始收到那个错误。
好吧,我似乎在使用服务帐户时遗漏了用户授权部分。
根据另一个线程,在使用域范围委托时需要代表用户行事:
我已经用以下几行更新了我的代码:
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)
不再达到阻止插入有与会者的事件的限制。尽管域验证和全域委托,但没有用户委托的服务帐户未被识别为我的域内部。