Я пытаюсь создать такой запрос, но с Ruby.
curl --request POST \
--url '{BASE_URL}/oauth2/token' \
--header 'Authorization: Basic {BASIC_CLIENT}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data grant_type=client_credentials
Я пытаюсь так:
require 'uri'
require 'net/http'
url = URI("https://api.userede.com.br/redelabs/oauth2/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = http.post(
url,
{ 'grant_type' => 'client_credentials' }.to_json,
{ 'Authorization' => "BasiC#{CLIENTID}", 'Content-Type' => 'application/x-www-form-urlencoded'}
)
Но я получаю следующую ошибку:
{\"error_description\":\"OAuth 2.0 Parameter: grant_type\",\"error\":\"invalid_request\",\"error_uri\":\"https://datatracker.ietf.org/doc/html/rfc6749#section-5.2\"}
Вы форматируете запрос как JSON, но система ожидает application/x-www-form-urlencoded.
Замените это:
{ 'grant_type' => 'client_credentials' }.to_json,
с этим:
{ 'grant_type' => 'client_credentials' }.to_query,
чтобы соответствовать правильному типу полезной нагрузки.
Возможно, это не единственная ошибка, но она очевидна.
Респект @max в его ответе о синтаксисе Rails.
Это работает!! Спасибо. Это был мой запрос.body.. {\"access_token\":\"ACCESS_TOKEN\",\"scope\":\"feature_merchant_statement trade-statement\",\"token_type\":\"Bearer\", \"expires_in\":1439}" Как мне получить доступ к access_token? Я пробовал request.body.access_token / request.body['access_token']
Хотя это довольно просто, в большинстве случаев для кодирования данных формы можно использовать что-то вроде URI#encode_www_form.
Я получаю это с помощью JSON.parse(request.body). Спасибо @PaulProgrammer.
Спасибо @engineersmnky! Я эксперт API/OAuth, а не эксперт по Ruby.
В Rails вы можете просто использовать { grant_type: 'client_credentials' }.to_query
для преобразования хеша в formdata. api.rubyonrails.org/v7.0/classes/Hash.html#method-i-to_query
Используйте Hash#to_query, чтобы преобразовать хеш в пары FormData вместо JSON:
require 'uri'
require 'net/http'
url = URI("https://api.userede.com.br/redelabs/oauth2/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = http.post(
url,
{ 'grant_type' => 'client_credentials' }.to_query,
{ 'Authorization' => "BasiC#{CLIENTID}", 'Content-Type' => 'application/x-www-form-urlencoded'}
)