我是Rails的新手,我想从我的网络应用程序中将数据导出到Google Spread Sheet。
此代码成功运行,打开一个新的授权选项卡,并显示要粘贴的代码。这就是我陷入困境的地步。谷歌授权要求的代码在我的控制器代码中,因此我的用户可以将该代码粘贴到我的控制器中。我知道它的安静愚蠢的问题,但我没有找到一种方法来自动从api中获取代码以进一步执行,就像我们通常在facebook oauth应用程序中那样。所以你能指导我怎么做吗?代码看起来像
def export_spred_sheet
require 'rubygems'
require 'google/api_client'
require 'launchy'
# Get your credentials from the console
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
# Create a new API client & load the Google Drive API
client = Google::APIClient.new
drive = client.discovered_api('drive', 'v2')
# Request authorization
client.authorization.client_id = CLIENT_ID
client.authorization.client_secret = CLIENT_SECRET
client.authorization.scope = OAUTH_SCOPE
client.authorization.redirect_uri = REDIRECT_URI
uri = client.authorization.authorization_uri
Launchy.open(uri)
# Exchange authorization code for access token
$stdout.write "Enter authorization code: "
client.authorization.code = gets.chomp
client.authorization.fetch_access_token!
# Insert a file
file = drive.files.insert.request_schema.new({
'title' => 'My document',
'description' => 'A test document',
'mimeType' => 'text/plain'
})
media = Google::APIClient::UploadIO.new('document.txt', 'text/plain')
result = client.execute(
:api_method => drive.files.insert,
:body_object => file,
:media => media,
:parameters => {
'uploadType' => 'multipart',
'alt' => 'json'})
# Pretty print the API result
jj result.data.to_hash
end
或者还有其他方法可以完成任务吗?如果我走错了路线?
答案 0 :(得分:0)
我在我的一个项目中也反对这一点,最后我发现了如下情况:
您可以使用服务帐户下google developer console生成的P12密钥进行身份验证,而不是使用客户端ID和客户端密钥。在这种情况下,您不需要在控制器中粘贴任何代码。
生成p12键
并使用以下代码段来获取访问令牌。
key_file = p12_key_file_path
key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, 'notasecret')
client = Google::APIClient.new application_name: "abcd", application_version: "1.0.0"
SERVICE_ACCOUNT_ID(在以下代码段中使用)将是google developer console中此“服务帐户”部分下生成的电子邮件地址。
client.authorization = Signet::OAuth2::Client.new(
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
:audience => 'https://accounts.google.com/o/oauth2/token',
:scope => 'https://www.googleapis.com/auth/analytics',
:issuer => SERVICE_ACCOUNT_ID,
:access_type => 'offline',
:signing_key => key
)
client.authorization.fetch_access_token!
client
我希望它会对你有所帮助。