Reddit api oauth эликсир аутентификации

Я пытаюсь получить токен доступа. Мне удалось заставить пользователя авторизовать мое приложение, теперь я пытаюсь получить токен доступа. Вот документация reddit oauth2: https://github.com/reddit-archive/reddit/wiki/oauth2, а вот почтовый запрос HTTPoison, который я использую: https://hexdocs.pm/httpoison/HTTPoison.html#post/4

Я понятия не имею, как сделать почтовый запрос, должен ли client_id быть в теле или в заголовке и т. Д.

  def get_oauth_token(token, state) do
    # TODO: compare state with old state to prevent malicious users
    cfg = config()

    url = 'https://www.reddit.com/api/v1/access_token'
    body  = %{
      grant_type: "authorization_code",
      code: token,
      redirect_uri: cfg[:redirect_uri],
      client_id: cfg[:client_id],
      client_secret: cfg[:client_secret]
    }
    |> Jason.encode()
    |> ok()

    HTTPoison.post(url, body, [
      {"Accept", "application/json"},
      {"Content-Type", "application/x-www-form-urlencoded"},
    ])
  end

  defp ok({:ok, response}), do: response

Я получаю код статуса 401

ожидаемый результат

{
    "access_token": Your access token,
    "token_type": "bearer",
    "expires_in": Unix Epoch Seconds,
    "scope": A scope string,
    "refresh_token": Your refresh token
}

person Manos Koutselakis    schedule 20.07.2019    source источник


Ответы (1)


API ожидает application/x-www-form-urlencoded, поэтому вам не следует кодировать в JSON.

Согласно документам Reddit, вы также необходимо закодировать ваши client_id и client_secret в заголовок Authorization с использованием базовой проверки подлинности HTTP.

url = "https://www.reddit.com/api/v1/access_token"

headers = [
  {"Content-Type", "application/x-www-form-urlencoded"},
  {"Authorization", "Basic " <> Base.encode64("#{cfg.client_id}:#{cfg.client_secret}")}
]

data = [
  grant_type: "authorization_code",
  code: token,
  redirect_uri: cfg.redirect_uri
]

HTTPoison.post(url, {:form, data}, headers)

Ознакомьтесь с документацией HTTPoison.Request, чтобы узнать о синтаксисе {:form, data} для отправки форм с кодировкой URL.

person Adam Millerchip    schedule 20.07.2019