似乎无法通过 Gmail API 进行身份验证以阅读电子邮件

Posted

技术标签:

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

我已经翻阅了大多数 *** 帖子以找到答案,但仍然无法解决这个问题。这只是在 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 访问用户的收件箱,您需要获得用户的授权。一旦获得同意,服务器将向您的应用程序返回一个访问令牌和该用户的刷新令牌。如果您不想在您的应用每次代表用户访问时征求用户的同意。然后存储刷新令牌,并重复使用它们以获得新的访问令牌。 【参考方案1】:

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

delegating authority

【讨论】:

以上是关于似乎无法通过 Gmail API 进行身份验证以阅读电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

通过浏览器身份验证和休息请求 - Gmail API

如何在没有手动浏览器身份验证的情况下从 Meteor.js 应用程序对 GMail-api 进行 oauth (2) 身份验证?

我应该使用哪个 Java 库通过 Facebook、Gmail、本地身份验证等进行身份验证?

谷歌 gmail api oauth2 身份验证错过了解

退回 <nobody@gmail.com> Gmail API 发送失败

无法使用 Header 中的 Api Key 进行身份验证