Вызов Uber API из Rails: {ошибка: invalid_client}

Был на этом в течение дня.

Использование Rails для вызова API Uber и невозможность получить токен доступа. Получение кода авторизации работает, а обмен на токен доступа — нет.

Я пробовал с геммом OAuth 2.0 и без него и убедился, что все мои ключи точны. Пробовал и на двух разных аккаунтах Uber. Все комбинации дают одну и ту же ошибку: {"error": "invalid_client"}.

Ниже я опубликую код без OAuth. params[:code] — это код авторизации, возвращенный Uber.

uri = URI.parse('https://login.uber.com/oauth/v2/token')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

headers = {
  # authentication content-type is not json
  # 'Content-Type'  => 'application/x-www-form-urlencoded',
  'Authorization' => 'Token ' + @server_token
}

request = Net::HTTP::Post.new(uri.path, headers)

request.set_form_data({
  'client_id'     => @client_id,
  'client_secret' => @client_secret,
  'grant_type'    => 'authorization_code',
  'code'          => params[:code]
})

response = https.request(request)

render :json => response.body

Заранее спасибо за помощь.


person Areios    schedule 25.04.2016    source источник
comment
Вы проверили, что @client_id и @client_secret содержат правильные данные?   -  person dan-klasson    schedule 25.04.2016
comment
@dan-klasson Да, эти объекты содержат правильные данные. Еще раз перепроверил.   -  person Areios    schedule 25.04.2016
comment
Обновление: это работает, когда я вручную отправляю свои ключи и вновь сгенерированный код авторизации в файле curl (developer.uber. com/docs/authentication), поэтому я, вероятно, просто делаю что-то глупое в Rails. Также новичок в OAuth.   -  person Areios    schedule 25.04.2016


Ответы (1)


  • Если вы получаете {"error": "invalid_client"}, это означает, что вы отправляете дополнительный заголовок HTTP-запроса, который не требуется, но проверяется сервером поставщика Uber OAuth.
    Другая возможная причина может заключаться в том, что вы неправильно написали имена параметров запроса. (не ваш случай)

    Решение: вам нужно удалить заголовок Authorization из вашего запроса и повторить попытку, т. е. не отправлять заголовки HTTP-запроса.

  • #P3#
    #P4#
    #P5# #P6# #P7#
  • Если код внутри params[:code] уже использовался один раз или стал недействительным, вы получаете {"error": "invalid_grant"}

    Решение. Вам необходимо повторить (первый) шаг авторизации в потоке OAuth, чтобы получить новый код, который необходимо обменять на токен доступа.

person Alex Bitek    schedule 25.04.2016
comment
Это помогло. Все, что мне нужно было сделать, это добавить redirect_uri к каждому вызову, но этот ответ также был золотой жилой информации. Спасибо, что приложили дополнительные усилия, чтобы помочь мне лучше понять, что происходит под капотом (каламбур). - person Areios; 25.04.2016