从Rails调用Uber API:{“error”:“invalid_client”}

时间:2016-04-25 02:56:36

标签: ruby-on-rails ruby-on-rails-4 oauth oauth-2.0 uber-api

在这一天。

使用Rails调用Uber API并且无法获取访问令牌。抓取授权代码有效,但是交换访问令牌则不行。

我尝试过使用和不使用OAuth 2.0 gem并确保所有密钥都准确无误。也试过两个独立的优步账户。所有组合都会出现相同的错误:{"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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  • 如果您获得{"error": "invalid_client"},则表示您正在发送额外的HTTP请求标头,该标头不是必需的,但由Uber OAuth提供商服务器验证。
    另一个可能的原因可能是您拼错了请求参数名称。 (不是你的情况)

    解决方案:您需要从请求中删除Authorization标头,然后重试,即不要发送任何HTTP请求标头。

  • 如果您在Uber Developers信息中心中定义了多个重定向网址,并且您正在进行身份验证请求而不记住,请记住使用信息中心中定义的第一个网址:

      

    如果没有提供,则默认值是第一个提供的重定向URI   应用程序的仪表板。

    如果该第一个网址与您在the authorize step of the OAuth flow中使用的网址不符,则会获得{"error": "access_denied"}

    但是,我注意到即使第一个URL与通过授权步骤发送的URL匹配也会引发此错误,因此我建议您在OAuth流程的每一步发送redirect_uri参数。

    解决方案:您需要在请求中发送redirect_uri参数(与您在授权步骤中使用的参数相同)

  • 如果params [:code]中的代码已被使用过一次或无效,则会得到{"error": "invalid_grant"}

    解决方案:您需要重做OAuth流程中的授权(第一)步骤,以获取需要交换访问令牌的新代码。