从 Rails 呼叫优步 API:{"error":"invalid_client"}
Calling Uber API from Rails: {"error": "invalid_client"}
在这里呆了一天。
使用 Rails 呼叫优步 API 并且未能获得访问令牌。获取授权码有效,但交换访问令牌无效。
我尝试过使用和不使用 OAuth 2.0 gem 并确保我所有的密钥都是准确的。也尝试了两个单独的 Uber 帐户。所有组合都给出相同的错误:{"error": "invalid_client"}
.
我将 post 下面的非 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
在此先感谢您的帮助。
如果您得到 {"error": "invalid_client"}
那么这意味着您正在发送一个额外的 HTTP 请求 header 这不是必需的,但由 Uber OAuth 提供商服务器验证。
另一个可能的原因可能是您拼错了请求参数名称。 (不是你的情况)
解决方案:您需要从请求中删除授权 header 并重试,即不要发送任何 HTTP 请求 header。
如果您在 Uber Developers Dashboard 中定义了多个重定向 URL,并且您在没有一个的情况下发出身份验证请求,请记住第一个 URL 在使用的仪表板:
If none is provided the default is the first redirect URI provided in
the application's dashboard.
如果第一个 URL 与您在 the authorize step of the OAuth flow 中使用的 URL 不匹配,您将得到 {"error": "access_denied"}
但是,我注意到即使第一个 URL 与授权步骤中发送的 URL 相匹配,也会引发此错误,因此我建议您发送 redirect_uri 参数在 OAuth 流程的每一步。
解决方法:您需要在请求中发送redirect_uri参数(与您在授权步骤中使用的相同)
如果 params[:code] 中的代码已经被使用过一次或者已经失效你得到 {"error": "invalid_grant"}
解决方案:您需要重做 OAuth 流程中的授权(第一步)以获得您需要交换访问令牌的新代码。
在这里呆了一天。
使用 Rails 呼叫优步 API 并且未能获得访问令牌。获取授权码有效,但交换访问令牌无效。
我尝试过使用和不使用 OAuth 2.0 gem 并确保我所有的密钥都是准确的。也尝试了两个单独的 Uber 帐户。所有组合都给出相同的错误:{"error": "invalid_client"}
.
我将 post 下面的非 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
在此先感谢您的帮助。
如果您得到
{"error": "invalid_client"}
那么这意味着您正在发送一个额外的 HTTP 请求 header 这不是必需的,但由 Uber OAuth 提供商服务器验证。
另一个可能的原因可能是您拼错了请求参数名称。 (不是你的情况)解决方案:您需要从请求中删除授权 header 并重试,即不要发送任何 HTTP 请求 header。
如果您在 Uber Developers Dashboard 中定义了多个重定向 URL,并且您在没有一个的情况下发出身份验证请求,请记住第一个 URL 在使用的仪表板:
If none is provided the default is the first redirect URI provided in the application's dashboard.
如果第一个 URL 与您在 the authorize step of the OAuth flow 中使用的 URL 不匹配,您将得到
{"error": "access_denied"}
但是,我注意到即使第一个 URL 与授权步骤中发送的 URL 相匹配,也会引发此错误,因此我建议您发送 redirect_uri 参数在 OAuth 流程的每一步。
解决方法:您需要在请求中发送redirect_uri参数(与您在授权步骤中使用的相同)
如果 params[:code] 中的代码已经被使用过一次或者已经失效你得到
{"error": "invalid_grant"}
解决方案:您需要重做 OAuth 流程中的授权(第一步)以获得您需要交换访问令牌的新代码。