通过服务器端的服务帐户使用 gmail api,避免使用 OAUTH2 GUI

Posted

技术标签:

【中文标题】通过服务器端的服务帐户使用 gmail api,避免使用 OAUTH2 GUI【英文标题】:Make use of the gmail api through a service account from the server side avoiding the OAUTH2 GUI 【发布时间】:2021-03-02 23:16:00 【问题描述】:

我有一个用 python 开发的应用程序,它使用 SMPT 服务连接到一个 gmail 帐户。这种类型的连接被称为“访问不安全的应用程序”lesssecureapps。

为了解决这个问题,我为自己设定了更新我的应用程序的任务,使用 gmail api 并使用从服务帐户生成的私钥进行身份验证(不使用 G-Suit)。

我已经创建了第一个概念证明,它似乎可以正确连接和验证,但是在尝试获取 gmail 帐户的标签时,我收到以下消息:

<HttpError 400 when requesting https://gmail.googleapis.com/gmail/v1/users/me/labels?alt=json returned "Precondition check failed.">

我回顾一下我配置我的谷歌帐户所遵循的步骤:

    我访问Google Api Console 并通过顶部显示的按钮启用 gmail api 的使用:启用 api 和服务 我访问凭据部分,单击顶部按钮:“创建凭据”并选择服务帐户 我创建一个服务帐号,然后生成一个json格式的私钥

我在我的概念证明中添加了一个小代码 sn-p,它返回了我在顶部评论的错误:

    from google.oauth2 import service_account
    from googleapiclient.discovery import build

    SCOPES = ['https://mail.google.com/','https://www.googleapis.com/auth/gmail.modify','https://www.googleapis.com/auth/gmail.readonly','https://www.googleapis.com/auth/gmail.labels','https://www.googleapis.com/auth/gmail.metadata','https://www.googleapis.com/auth/gmail.addons.current.message.metadata','https://www.googleapis.com/auth/gmail.addons.current.message.readonly']
    SERVICE_ACCOUNT_FILE = '/home/user/keys/privatekey_from_service_account.json'

    credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    service = build('gmail', 'v1', credentials=credentials)

    # Call the Gmail API
    results = service.users().labels().list(userId='me').execute()
    labels = results.get('labels', [])

    if not labels:
        print('No tienes labels.')
    else:
        print('Labels:')
        for label in labels:
            print(label['name'])

如何在不使用 g-suite 的情况下解决我的问题?

【问题讨论】:

【参考方案1】:

“前置条件检查失败。”

意味着你不能做你想做的事。

使用从服务帐户生成的私钥(不使用 G-Suit)。

Gmail api 不支持非 gsuite 域的服务帐户。您只能使用具有 Gsuite 域帐户和 gsuite 域电子邮件的服务帐户。

服务帐户无法与普通的 google gmail 帐户一起使用。

【讨论】:

感谢您的回答。在不使用普通gemail帐户与OAUTH GUI交互的情况下,我还能如何从服务器端使用Gmail api? 您可以在存储刷新令牌后使用 Oauth2 对您的应用程序进行身份验证,然后在每次需要访问 API 时使用刷新令牌。这是没有 gsuite 的唯一选择。提示:我建议使用 gmail 范围查看应用程序的验证过程,它可能会非常昂贵且耗时,最好尽早开始该过程。

以上是关于通过服务器端的服务帐户使用 gmail api,避免使用 OAUTH2 GUI的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API 是不是支持使用 OAuth 服务帐户?

当我尝试使用我的 Google 服务帐户通过 Gmail API 发送电子邮件时,“myemail@mydomain.com”的委派被拒绝

使用服务帐户的 Gmail API 集转发

NodeJS:无法使用服务帐户访问 Gmail API

Gmail API 服务帐户请求 - 前提条件检查失败

使用带有服务帐户的 Gmail API 发送邮件