GMail pu sh API - 400 не выполнено - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь выполнить watch, чтобы разрешить GMail pu sh API отправлять уведомления в PubSub. Я использую Elixir и уже использую другие API Google на том же языке; по какой-то причине у меня не получается с 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"
 }}

Я не понимаю почему это не удается. Кроме того, я проверил со спецификациями REST, и это выглядит правильно:

https://developers.google.com/gmail/api/v1/reference/users/messages/list

Ps: в качестве ссылки, следующий код работает:

  {: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
  )

Итак, процедура аутентификации выглядит правильно.

1 Ответ

0 голосов
/ 04 мая 2020

API Gmail требует олицетворения для получения сообщений пользователя и других ресурсов API. Администратор G Suite должен делегировать полномочия на уровне домена вашей учетной записи службы, чтобы он мог выдавать себя за пользователя, к сообщениям которого ваше приложение хочет получить доступ.

Вот некоторая информация о делегировании домена для учетной записи службы.

...