【问题标题】:Cant seem to authenticate to read gmail via Gmail API似乎无法通过 Gmail API 进行身份验证以阅读电子邮件
【发布时间】:2020-07-06 18:34:30
【问题描述】:

我已经翻阅了大多数 stackoverflow 帖子以找到答案,但仍然无法解决这个问题。这只是在 gmail api 中进行身份验证的简单问题,但我想在服务器中进行,所以我需要遵循服务器服务器(OAuth2.0 2 腿程序)。无论如何 我已经浏览了 google api 中的所有 oauth 文档。 这个是正确的,但它没有好处。 https://developers.google.com/gmail/api/auth/web-server.

我有一个服务帐户,并且我有 creds 文件。

这是我的代码 sn-p。

def call_gmail():
    SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
    SERVICE_ACCOUNT_FILE = '<creds_file>'
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    print(credentials)
    service = build('gmail', 'v1', credentials=credentials)
    messages = ListMessagesMatchingQuery(service, "me", "<Some email address>")
    message_id = messages[0]['id']

我不断收到此错误:

An error occurred: &lt;HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/history?startHistoryId=2547406&amp;alt=json returned "Bad Request"&gt;

 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

如果有人能帮我解决这个问题,我将不胜感激。谢谢。

【问题讨论】:

  • 您传递给ListMessagesMatchingQuery的“”参数是什么?
  • 你项目的服务账号,只能访问属于你应用的数据,也就是说,服务账号没有gmail收件箱;只要不请求用户数据,它就可以调用其他 API。如果希望使用服务帐户访问用户数据(邮件),则需要域范围授权。
  • @Aerials - 一些电子邮件地址是“发件人” .. 它会是“发件人:” ..
  • 这是个人帐户。如何通过个人帐户使用域范围委派?
  • 如果您想使用 Gmail API 访问用户的收件箱,您需要获得用户的授权。一旦获得同意,服务器将向您的应用程序返回一个访问令牌和该用户的刷新令牌。如果您不想在您的应用每次代表用户访问时征求用户的同意。然后存储刷新令牌,并重复使用它们以获得新的访问令牌。

标签: google-api google-oauth gmail-api google-api-python-client service-accounts


【解决方案1】:

如果服务帐户是 Gsuite 帐户并且您已设置域范围的委派,则 gmail api 仅适用于服务帐户。请联系您的 Gsuite 管理员,确保他们已正确设置委派。

delegating authority

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2016-03-03
    • 2021-12-28
    • 2018-04-01
    • 2015-09-15
    • 2018-02-12
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多