我目前正在为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交换令牌都将非常感激。
答案 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
希望它能帮助你找到正确的方向:)