2015-07-14 4 views
0

Я следую руководству OAuth here, чтобы получить код доступа, чтобы аутентифицировать мои запросы API в онлайн-программу учета Точный онлайн.Невозможно получить токен доступа для ExactOnline с OAuth

Однако я застрял на шаге 3, где я использую код авторизации, возвращенный на шаге 2, чтобы получить токен доступа.

Вот что я хочу:

require 'httparty' 

EXACT_CLIENT_ID = '<REDACTED>' 
EXACT_CLIENT_SECRET = '<REDACTED>' 
EXACT_SERVER_BASE_URL = 'https://start.exactonline.nl' 
EXACT_AUTH_CODE = '<REDACTED>' 

response = HTTParty.post("#{EXACT_SERVER_BASE_URL}/api/oauth2/token", headers: {'Content-Type' => 'application/x-www-form-urlencoded'}, query: {code: EXACT_AUTH_CODE, redirect_uri: 'http://<REDACTED>.runscope.net/', grant_type: 'authorization_code', client_id: EXACT_CLIENT_ID, client_secret: EXACT_CLIENT_SECRET}) 

puts response 
# => 'Bad request' 

puts response.code 
# => 400 

Я не понимаю, почему это происходит. При взгляде на список кодов ответа here, код означает:

Запрос не может быть понят сервером из-за некорректного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений .

Что я делаю неправильно?

Update # 1:

Я также попытался:

response_2 = HTTParty.post("#{EXACT_SERVER_BASE_URL}/api/oauth2/token", :headers => {'Content-Type' => 'application/x-www-form-urlencoded'}, :body => {'code' => EXACT_AUTH_CODE, 'redirect_uri' => 'http://<REDACED>.runscope.net/', 'grant_type' => 'authorization_code', 'client_id' => EXACT_CLIENT_ID, 'client_secret' => EXACT_CLIENT_SECRET}) 

Но ответ тот же.

ответ

1

Несмотря на использование метода HTTP POST, вы предоставляете значения в качестве параметров запроса, предоставляя их параметру query: методу .post. Вместо этого вы должны предоставить их в параметре body:, см.: How can I implement this POST request using HTTParty?

Также ваш синтаксис re. body::body должна быть исправлена, так что это будет выглядеть так:

response_2 = HTTParty.post("#{EXACT_SERVER_BASE_URL}/api/oauth2/token", :headers => {'Content-Type' => 'application/x-www-form-urlencoded'}, :body => {'code' => EXACT_AUTH_CODE, 'redirect_uri' => 'http://<REDACED>.runscope.net/', 'grant_type' => 'authorization_code', 'client_id' => EXACT_CLIENT_ID, 'client_secret' => EXACT_CLIENT_SECRET}) 

И последнее, но не менее важное: значение кода является использование только один раз и имеет короткий срок службы; убедитесь, что вы используете только что полученный.

+0

Я также попытался использовать параметр 'body:', см. Обновленный вопрос выше, но результат тот же ... – narzero

+1

Значение «code» - одноразовое использование и имеет короткое время жизни; убедитесь, что вы используете только что полученный –

+0

Все работает сейчас! Пожалуйста, обновите свой ответ, чтобы я мог принять – narzero