我正试图执行一个 watch
启用GMail推送API向PubSub发送通知。我正在使用Elixir,并且我已经在使用其他Google API,用同样的语言;由于某些原因,我使用GMail API失败了。
我收到了一个400的BAD REQUEST,在正文中写着 "preconditionFailed"。
由于400,我猜测我传递值的方式不对。所以我尝试获取邮件列表,这是一个不需要参数的调用。
{:ok, token} = Goth.Token.for_scope("https://mail.google.com/")
conn = GoogleApi.Gmail.V1.Connection.new(token.token)
GoogleApi.Gmail.V1.Api.Users.gmail_users_messages_list(conn, "me")
但我还是收到了400
{:error,
%Tesla.Env{
__client__: %Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.Headers, :call,
[
[
{"authorization",
"Bearer TOKEN HERE"}
]
]}
]
},
__module__: GoogleApi.Gmail.V1.Connection,
body: "{\n \"error\": {\n \"errors\": [\n {\n \"domain\": \"global\",\n \"reason\": \"failedPrecondition\",\n \"message\": \"Bad Request\"\n }\n ],\n \"code\": 400,\n \"message\": \"Bad Request\"\n }\n}\n",
headers: [
{"cache-control", "private, max-age=0"},
{"date", "Fri, 01 May 2020 19:40:10 GMT"},
{"accept-ranges", "none"},
{"server", "GSE"},
{"vary", "X-Origin"},
{"content-length", "179"},
{"content-type", "application/json; charset=UTF-8"},
{"expires", "Fri, 01 May 2020 19:40:10 GMT"},
{"x-content-type-options", "nosniff"},
{"x-frame-options", "SAMEORIGIN"},
{"content-security-policy", "frame-ancestors 'self'"},
{"x-xss-protection", "1; mode=block"},
{"alt-svc",
"h3-Q050=\":443\"; ma=2592000,h3-Q049=\":443\"; ma=2592000,h3-Q048=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\""}
],
method: :get,
opts: [],
query: [],
status: 400,
url: "https://www.googleapis.com/gmail/v1/users/me/messages"
}}
我不明白为什么会失败。 I don't understand why this is failing. 此外,我已经检查了REST规范,它看起来是正确的。
https:/developers.google.comgmailapiv1referenceusersmessageslist.
P.s.:作为参考,下面的代码可以用。
{:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/cloud-platform")
conn = GoogleApi.PubSub.V1.Connection.new(token.token)
pubsub_message = %GoogleApi.PubSub.V1.Model.PubsubMessage{
data: message |> Jason.encode!() |> Base.encode64(padding: true)
}
request = %GoogleApi.PubSub.V1.Model.PublishRequest{
messages: [pubsub_message]
}
Projects.pubsub_projects_topics_publish(
conn,
<PROJECT>,
"consolidation-messages",
body: request
)
所以认证程序看起来是正确的
Gmail API,确实需要冒充用户来获取用户的消息和其他API资源,你的G Suite管理员应该将域范围内的权限委托给你的服务账户,以便它能够冒充你的应用程序想要访问的消息的用户。
下面是关于服务帐号域范围授权的一些信息。
在文件中,有一个小部分 大多数人都忽略了,这是关键。而且我相信你在授权客户端的时候,一定是在这里遇到了问题。
这个 增编 这里的。[1]. 你可能需要创建自己的JWT令牌来进行授权的API调用。
[1]https:/developers.google.comidentityprotocolsoauth2service-account#jwt-auth。