GMail推送API - 400个失败条件

问题描述 投票:0回答:1

我正试图执行一个 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
  )

所以认证程序看起来是正确的

api google-cloud-platform elixir gmail-api
1个回答
0
投票

Gmail API,确实需要冒充用户来获取用户的消息和其他API资源,你的G Suite管理员应该将域范围内的权限委托给你的服务账户,以便它能够冒充你的应用程序想要访问的消息的用户。

下面是关于服务帐号域范围授权的一些信息。


注意:

在文件中,有一个小部分 大多数人都忽略了,这是关键。而且我相信你在授权客户端的时候,一定是在这里遇到了问题。

这个 增编 这里的。[1]. 你可能需要创建自己的JWT令牌来进行授权的API调用。

[1]https:/developers.google.comidentityprotocolsoauth2service-account#jwt-auth。

© www.soinside.com 2019 - 2024. All rights reserved.