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)
我有一个使用 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)