【问题标题】:error code 400 when trying to read GMAIL using a service account尝试使用服务帐户读取 GMAIL 时出现错误代码 400
【发布时间】:2021-01-01 04:38:13
【问题描述】:

我正在使用 Gmail 的 API 将邮件阅读到收件箱。 我在云开发人员组合中有一个项目。我使用我必须从中获取数据的收件箱的帐户登录。 我已经创建了一个没有任何角色等的服务帐户并下载了所需的密钥。 我使用以下方法构建了一个资源:

scopes = ["https://www.googleapis.com/auth/gmail.readonly"]
credentials = service_account.Credentials.from_service_account_files(path, scopes=scopes)
service = build(
   "gmail",
   "v1",
   credentials=credentials
)

这很好。但是当我尝试从收件箱中提取信息时:

responses = service.users().messages().list(userId="me").execute()

这给了我:

googleapiclient.errors.HttpError: <HttpError 400 when requesting <email> returned "Precondition check failed.">

我尝试将“我”更改为电子邮件,设置一些角色。我可以使用 OAuth 凭据而不是服务密钥来访问它。什么可能导致我的问题?

【问题讨论】:

  • 您是否设置了 Gsuite 管理员 service-account#delegatingauthority?除此之外,me 无法正常工作,因为服务帐户没有您需要委派给 gsuite 域用户的 gmail 帐户。
  • 尝试按照指南进行操作,但我使用的帐户不符合 GSuite 管理员资格,所以它不会让我授予它权限?
  • 通过 gmail 使用服务帐户的唯一方法是使用 gsuite 域电子邮件帐户,它不能使用标准 gmail 帐户。

标签: python-3.x gmail gmail-api google-api-python-client service-accounts


【解决方案1】:

我将尝试扩展 @DalmTo 在 cmets 中所说的内容。

服务帐号

Service accounts 是无需人工干预即可工作的特殊帐户,它们可以像在普通帐户中一样使用某些 google 的 API。有些 API(如 Gmail)无法作为服务帐户访问,因为这会导致问题,如垃圾邮件或问题。

但简而言之,服务帐户是完全独立的帐户,无需人工干预即可使用 API。


域范围委托

有时在具有企业行为的公司(域)中,应该对所有用户完成一些任务,备份所有驱动器文件,检查电子邮件中的垃圾邮件恶意内容或任何您能想象到的事情。为此服务帐户可以有一个特殊的行为to substitute an user。所以service account is delegated with the user access到域内的API。


回答您的问题

对于您的具体情况:

  • 不能通过服务帐户使用 GMail API
  • 如果您没有域开始,则您不能使用域范围授权

替代品

所以此时您的设置无法使用服务帐户,所以唯一的方法是使用您的常规帐户和常规OAuth authentication

我不会详细介绍,因为这不是您要求的,但如果您不熟悉它,有一些方法可以使用refresh token,因此您只需在第一次授权您的应用程序并且每当refresh token 失效时。

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 2018-05-26
    • 1970-01-01
    • 2015-12-12
    • 2020-04-10
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多