Google Cross客户端授权和invalid_grant错误

时间:2017-12-11 11:51:52

标签: ruby-on-rails ruby google-api google-oauth google-oauth2

我目前正在为Google Api跨客户端授权开发Web组件,如本文所述。 https://developers.google.com/identity/protocols/CrossClientAuth

此外,我所处的环境是Rails,因此我正在使用本文所述的google-api-client gem https://developers.google.com/identity/protocols/OAuth2WebServer#handlingtheresponse

授权代码是通过Android应用程序使用Web客户端ID获取的,并传递到web api以便进行交换。我使用gem和代码进行交换如下

auth_client = Google::APIClient::ClientSecrets.load("/path/to/client_secrets.json").to_
authorization
auth_client.code = code
auth_client.fetch_access_token!

我还试过

auth_client = Google::APIClient::ClientSecrets.load("/path/to/client_secrets.json").to_
authorization
auth_client.update!(
  :grant_type => 'authorization_code'
)
auth_client.code = code
auth_client.fetch_access_token!

在所有情况下,我都会收到来自Google的无效授权错误,但没有说明。

我尝试构建网址以利用其他api工具,例如curl和postman,并绕过gem,使用google oauth游乐场而没有任何成功。

任何洞察可能产生无效授权错误的内容或如何生成curl请求以直接与Google外部的Google交换令牌都将非常感激。

2 个答案:

答案 0 :(得分:1)

{“error”: “invalid_grant”, “error_description”: “Bad Request”}

通常意味着您用于请求访问的客户端ID和密码不是用于创建相关代码的客户端ID和密码。

必须使用相同的凭据授权来自Android应用程序的凭据的授权代码请求。你不能以这种方式混合和匹配凭证。

我建议您让您的网络应用程序请求凭据,Android应用程序应该能够使用内存服务时创建的Web凭据创建的刷新令牌。

答案 1 :(得分:0)

好吧,也许不是您正在寻找的解决方案,但我一直在应用程序的前端使用JavaScript login API并通过params将令牌传递到后端,后者被硬编码到宝石请求就像这个例子:

ga_view_ids = @service.list_account_summaries(options: {header: {authorization: "Bearer #{params[:access_token]}"}}).items

希望它能帮助你找到正确的方向:)