使用委派的全域权限访问 gmail API

Posted

技术标签:

【中文标题】使用委派的全域权限访问 gmail API【英文标题】:Accessing the gmail API with delegated domain-wide authority 【发布时间】:2018-06-18 14:49:47 【问题描述】:

我在我的 g-suite 组织中有一个 gmail 帐户,我想自动读取其 gmail 消息。 由于这需要通过自动化流程定期运行,因此常规 OAuth 流程没有用处,因为需要有人打开浏览器并授予自动访问权限。

到目前为止,我已经创建了一个具有域范围权限的服务帐户,如 here 所记录的那样。

我使用的代码是:

import httplib2
from apiclient import discovery

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly', ]
CLIENT_SECRET_FILE = '/path/to/client_secrets.json'


def get_credentials():
    from oauth2client.service_account import ServiceAccountCredentials
    credentials = ServiceAccountCredentials.from_json_keyfile_name(CLIENT_SECRET_FILE, SCOPES)
    delegated_credentials = credentials.create_delegated('myproject@myproject-123456.iam.gserviceaccount.com')
    return delegated_credentials


def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)

    results = service.users().messages().list(userId='user_to_impersonate@mycompany.com').execute()


if __name__ == '__main__':
    main()

但我收到 400 Bad Request 错误:

Traceback (most recent call last):
  File "gmail.py", line 77, in <module>
    main()
  File "gmail.py", line 65, in main
    results = service.users().messages().list(userId='user_to_impersonate@mycompany.com').execute()
  File "/usr/local/lib/python3.6/site-packages/oauth2client/_helpers.py", line 133, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/googleapiclient/http.py", line 842, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/user_to_impersonate%40mycompany.com/messages?alt=json returned "Bad Request">

是否可以访问特定的 gmail 帐户而无需从浏览器授予权限?我需要先执行任何特殊步骤吗?或者,有什么方法可以获取更多的调试信息?

【问题讨论】:

是的,您应该能够使用服务帐户访问 gsuite gmail 帐户。 gsuite 帐户的管理员只需要授予服务帐户访问权限。 developers.google.com/gmail/api/auth/web-server 【参考方案1】:

基于the docs,你需要使用delegated_credentials = credentials.create_delegated('user_to_impersonate@mycompany.com')而不是delegated_credentials = credentials.create_delegated('myproject@myproject-123456.iam.gserviceaccount.com')

【讨论】:

以上是关于使用委派的全域权限访问 gmail API的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API 将访问权限限制为仅一个组

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

NodeJS 中的 API Gmail:(节点:14592)UnhandledPromiseRejectionWarning:错误:委派被拒绝

我可以使用 Gmail API 访问同一域中其他用户的邮件列表和设置吗?

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

通过服务帐户设置 Gmail 委托时出现权限不足错误