Как получить токен доступа от Oauth Infusionsoft с рубином?

Мы интегрируем наше приложение ruby ​​on rails 4 с XML-RPC API Infusionsoft через их трехэтапную реализацию Oauth2.

(Документация здесь — https://developer.infusionsoft.com/docs/xml-rpc/#authentication-request-permission)

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

def connect_inf
    redirect_to "https://signin.infusionsoft.com/app/oauth/authorize?client_id=XXXXXXX&redirect_uri=https://testappurl.herokuapp.com/websites/1/connect_inf/callback/&response_type=code&scope=full"
end

Затем, после того, как пользователь аутентифицируется, пользователь возвращается к нашему действию обратного вызова с URL-адресом, который выглядит следующим образом...

https://testappurl.herokuapp.com/websites/1/connect_inf/callback?scope=full|theirappdomain.infusionsoft.com&code=XXXXXXX

Где мы получаем код и используем RestClient, чтобы отправить его обратно в Infusionsoft для запроса токена доступа с параметрами в том порядке, в котором они указаны в их документации.

def get_inf
    response = RestClient.post 'https://api.infusionsoft.com/token', :client_id => 'XXXXXXXXXXXXXX', :client_secret => 'XXXXXXX', :code => params[:code], :grant_type => 'authorization_code', :redirect_uri => 'https://testappurl.herokuapp.com/websites/1/connect_inf/callback/', :accept => 'text/xml'
end

Это возвращает RestClient::BadRequest: 400 Bad Request

Я предполагаю, что это как-то связано с тем, как передаются параметры.


person user2101461    schedule 18.01.2016    source источник
comment
Плохой запрос часто означает, что параметры неверны. Что содержит params? И действительно ли API обрабатывает XML?   -  person Eric Platon    schedule 19.01.2016


Ответы (1)


Для справки разработчиков ruby, получающих доступ к API Infusionsoft, это было вызвано рядом проблем, вызванных использованием динамических URL-адресов перенаправления и обратного вызова. Infusionsoft вносит в белый список один URL-адрес обратного вызова, который вы указываете при регистрации своего приложения.

Я смог решить эту проблему, используя стратегию OmniAuth для Infusionsoft и используя OmniAuth для доступа к токенам.

https://github.com/L1h3r/omniauth-infusionsoft

Мы указали путь обратного вызова omniauth по умолчанию «/auth/infusionsoft/callback» на действие контроллера в наших маршрутах.

get '/auth/:provider/callback', to: 'websites#get_inf'

Где мы смогли получить доступ к токенам вот так...

def get_inf
    access_token = env["omniauth.auth"]['credentials']['token']
    refresh_token = env["omniauth.auth"]['credentials']['refresh_token']
    expires_at = env["omniauth.auth"]['credentials']['expires_at']
end

Затем вы можете сохранить эти токены, например, в пользовательском объекте.

person user2101461    schedule 19.01.2016