Google 在 ruby 从服务器端应用程序登录

Google Signin from server side app in ruby

我有一个使用 google 登录并向我的后端应用程序发送服务器授权码的移动应用程序。 我想使用此代码以及来自 google 开发人员控制台的客户端机密来检索用于在用户离线时从 google 驱动器检索数据的刷新代码。

Google 为 ruby 中的 auth 调用提供了 client,但最近似乎没有维护,我在文档。 在文档中,我可以找到如何在 python:

上执行此操作的示例
from oauth2client import client

# Exchange auth code for access token, refresh token, and ID token
credentials = client.credentials_from_clientsecrets_and_code(
    CLIENT_SECRET_FILE,
    ['https://www.googleapis.com/auth/drive.appdata', 'profile', 'email'],
    auth_code)

我想在 ruby 中通过 post 到他们的 https://www.googleapis.com/oauth2/v4/token 端点执行此操作。这是我到目前为止尝试过的方法:

require 'uri'
require 'net/http'
require 'json'

url = URI("https://www.googleapis.com/oauth2/v4/token")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true    

headers = {'Content-Type': 'application/json'}
request = Net::HTTP::Post.new(url.request_uri, headers)

request.body = {
    code: "#{server_auth_code_sent_to_api}",
    client_id: "#{client_id_from_developer_console}",
    client_secret: "#{client_secret_from_developer_console}",
    grant_type: 'authorization_code',
    redirect_url: '',
}.to_json

response = http.request(request)
puts JSON.parse(response.read_body)

但我不断收到以下错误:

{
 "error": "unsupported_grant_type",
 "error_description": "Invalid grant_type: "
}

有没有人知道我做错了什么,或者有关于如何进行这种授权的工作示例? 提前致谢。

万一有人在这里遇到类似问题,导致请求失败的原因是 Content-Type,而不是 grant_type 参数。 仔细研究客户端库的代码,我发现他们使用 application/x-www-form-urlencoded 端点需要 application/x-www-form-urlencoded 内容类型。我相应地调整了我的代码,并且能够使用有效的凭据和令牌获得成功的响应。 下面是结果代码:

require 'uri'
require 'net/http'
require 'json'

url = URI("https://www.googleapis.com/oauth2/v4/token")

params = {
    "code" => "#{server_auth_code_sent_to_api}",
    "client_id" => "#{client_id_from_developer_console}",
    "client_secret" => "#{client_secret_from_developer_console}",
    "grant_type" => "authorization_code",
    "redirect_url" => "#{redirect_url_from_developer_console}",
}

response = Net::HTTP.post_form(url, params)

puts JSON.parse(response.read_body)