【问题标题】:Google Calendar API : How to avoid 403 usage limit for domain internal guests?Google Calendar API:如何避免域内部访客的 403 使用限制?
【发布时间】:2020-02-13 09:05:38
【问题描述】:

我正在使用服务帐户和 Google Calendar v3 API 来邀请域内部来宾参加活动。我收到Encountered 403 Forbidden with reason "quotaExceeded" 错误。但是,从控制台,没有达到 API 限制,当我停止邀请客人时,错误消失了。

根据 Google Cloud Platform 控制台中可用的设置,拥有服务帐户的 Google Cloud Platform 项目与我的域密切相关,位于:API 和服务 > 域验证部分。

此外,我所有的客人都拥有与我的域相关的 G Suite 帐户,并且我已在我的服务帐户设置中启用了 G Suite 域范围的委派。 p>

我认为这足以防止由于客人邀请而导致的 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()

【问题讨论】:

  • 完整的错误信息是什么?
  • 我在日志中发现的错误信息是:Encountered 403 Forbidden with reason "quotaExceeded" 就是这样,不是我在描述中提到的,我要更新它。
  • 它没有准确说明您达到了哪个配额?如果您等待几分钟,它会再次起作用还是在一天的剩余时间里都不起作用?
  • 不幸的是,我没有更详细的错误:/ 从第一次失败开始,错误持续了不到一个小时,直到我删除了事件插入请求的“参加者”参数。
  • 你可以去console.cloud.google.com -> 选择与服务帐户关联的项目 -> APIs & Services -> 仪表板 -> 从列表中选择 Google Calendar API -> 检查交通图。如果您在图表中拖动选择特定时间区域,它将放大,您可以以 15 秒的间隔放大。因此,您将能够查看您是否达到了每 100 秒 500 个请求的默认配额,您也可以对其进行编辑以增加它。

标签: google-cloud-platform google-calendar-api


【解决方案1】:

403 超过禁止使用限制

通常是防洪。当您向 Google API 发出请求时,用户每 100 秒最多可以发出 X 个请求。用户由请求来自的 IP 地址表示。当您使用服务帐户时,它就是您的代码正在运行的服务器。您需要放慢代码速度,如果确实遇到此错误,只需等待几秒钟,然后再次发出相同的请求。

如果您代表另一个用户执行这些操作,那么您可以尝试将 QuotaUser 参数添加到您的所有请求中,以表明这实际上是一个不同的用户。这有时会有所帮助,但它不是万无一失的证明我一直试图向它发送一个随机数,最终谷歌发现了这个错误。

【讨论】:

  • 谢谢,从控制台配额界面我可以看到每个用户每 100 秒的请求在发生错误时仅达到 3.9 的峰值,这是 2 小时的平均值,因此它可能隐藏了更多的本地峰值...我去看看
  • 对使用情况图表持保留态度。如果您发出请求并且您的请求在没有其他人的服务器上运行。您可以在 10 秒内轻松启动 100 个请求。如果他们说你达到了洪水配额,那么你就达到了。
【解决方案2】:

好吧,我在使用服务帐户时似乎遗漏了用户委托部分。 根据另一个线程,使用域范围委托时需要代表用户行事:Is it possible to call APIs from service account without acting on behalf of a user in domain-wide delegation?

我已经用以下几行更新了我的代码:

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)

不再达到阻止与与会者一起插入活动的限制。尽管进行了域验证和域范围的委派,但没有用户委派的服务帐户未被识别为我域的内部帐户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2014-02-14
    • 2019-03-03
    • 2013-12-29
    相关资源
    最近更新 更多