【发布时间】: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: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/history?startHistoryId=2547406&alt=json returned "Bad Request">
"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