Ruby google_drive gem oAuth2节省

因此,在更新之前有一种简单的方法来登录谷歌驱动器并操纵您的谷歌文档 – 使用ruby。

在您使用此function登录Google云端硬盘之前。

require 'google_drive' $session = GoogleDrive.login("email@gmail.com", "password") 

但现在你收到警告信息:

 WARNING: GoogleDrive.login is deprecated and will be removed in the next version. Use GoogleDrive.login_with_oauth instead. 

所以我去了git hub页面看看google是如何让我们使用高级语言的服务,并发现他们希望我们使用oAuth2。 像这样。

 require 'google/api_client' require 'google_drive' client = Google::APIClient.new( :application_name => 'Example Ruby application', :application_version => '1.0.0' ) auth = client.authorization auth.client_id = "YOUR CLIENT ID" auth.client_secret = "YOUR CLIENT SECRET" auth.scope = "https://www.googleapis.com/auth/drive " + "https://spreadsheets.google.com/feeds/" auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob" print("1. Open this page:\n%s\n\n" % auth.authorization_uri) print("2. Enter the authorization code shown in the page: ") auth.code = $stdin.gets.chomp auth.fetch_access_token! access_token = auth.access_token $session = GoogleDrive.login_with_oauth(access_token) 

这很好,除了我无法保存auth变量。 我想在脚本中对此进行硬编码,因此我不必继续谷歌来获取新的access_token。

所以我试图获取access_token并将其添加到脚本中。

 require 'google/api_client' require 'google_drive' client = Google::APIClient.new access_token = "TokenFromGoogleHardCoded" $session = GoogleDrive.login_with_oauth(access_token) # $session doesn't connect 

我不确定我是否在正确的庄园里攻击这个问题。 我想保存完整的auth变量并在我的脚本中硬编码。

我弄清楚这个烂摊子。

 auth.scope = "https://www.googleapis.com/auth/drive " + "https://spreadsheets.google.com/feeds/" 

auth.scope缺少一个url。 来自github的参考

 auth.scope = "https://docs.google.com/feeds/" + "https://www.googleapis.com/auth/drive " + "https://spreadsheets.google.com/feeds/" 

您可以重复使用access_token,但首先需要获取它。 警告:auth.access_token仅适用于一小时。 如果你需要另一个,你需要调用auth.refresh! 这将发给你另一个access_token。

 require 'google/api_client' require 'google_drive' client = Google::APIClient.new( :application_name => 'Example Ruby application', :application_version => '1.0.0' ) auth = client.authorization auth.client_id = "YOUR CLIENT ID" auth.client_secret = "YOUR CLIENT SECRET" auth.scope = "https://www.googleapis.com/auth/drive " + "https://spreadsheets.google.com/feeds/" auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob" print("1. Open this page:\n%s\n\n" % auth.authorization_uri) print("2. Enter the authorization code shown in the page: ") auth.code = $stdin.gets.chomp auth.fetch_access_token! access_token = auth.access_token system'clear' print "Save your access token\n\n" print access_token print "\nSave your refresh token\n\n" print auth.refresh_token 

这段代码应该在控制台中打印出access_token / refresh_token。 现在您可以对应用程序进行硬编码。

 require "google/api_client" require "google_driver" client = Google::APIClient.new( :application_name => 'Example Ruby application', :application_version => '1.0.0' ) auth = client.authorization auth.client_id = "Your Client ID" auth.client_secret = "Your client secret" access_token = "token you saved from the terminal" session = GoogleDrive.login_with_oauth(access_token) for file in session.files p file.title end 

最终你的“access_token”将过期。 此时你需要“刷新”它。 您可以通过调用来调用以查看您的access_token是否已过期

 auth.expires_at 

您可以使用此示例获取新的访问令牌。

 require 'google/api_client' require 'google_drive' $client_id = "YOUR CLIENT ID" $client_secret = "YOUR CLIENT SECRET" $refresh_token = "SAVED REFRESH TOKEN" client = Google::APIClient.new(:application_name => 'Example Ruby application', :application_version => '1.0.0') auth = client.authorization auth.client_id = $client_id auth.client_secret = $client_secret auth.scope = "https://docs.google.com/feeds/" + "https://www.googleapis.com/auth/drive " + "https://spreadsheets.google.com/feeds/" auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob" auth.refresh_token = $refresh_token #here's the magic sauce auth.refresh! #as you can see above auth.access_token wasn't passed a value # but if you call it now you'll see you have a new access_token auth.access_token => new token from server 

您可能会发现使用服务帐户更容易,如下所述:

https://github.com/gimite/google-drive-ruby/issues/126#issuecomment-73542381

虽然Duck1337的答案可行,但你实际上并不需要调用auth.refresh! 使用google_drive 1.0。*。

您需要做的就是在第一个实例中提供授权代码时保存refresh_token ,然后在调用auth.fetch_access_token之前始终传递 并且令牌将自动刷新。

以下是我用来登录的内容。 我使用环境变量而不是代码常量,因此我可以将它们添加到Heroku Config Vars中,并将敏感数据保留在代码之外。

 client = Google::APIClient.new auth = client.authorization auth.client_id = ENV['GOOGLE_CLIENT_ID'] auth.client_secret = ENV['GOOGLE_CLIENT_SECRET'] auth.scope = [ "https://www.googleapis.com/auth/drive", "https://spreadsheets.google.com/feeds/" ] auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob" if ENV['GOOGLE_REFRESH_TOKEN'] == "0" # Always start with 0 in your .env file, eg GOOGLE_REFRESH_TOKEN = 0 puts("1. Open this page:\n%s\n\n" % auth.authorization_uri) puts("2. Enter the authorization code shown in the page: ") auth.code = $stdin.gets.chomp end if auth.refresh_token = ENV['GOOGLE_REFRESH_TOKEN'] #this will be 0 the first time around, but that's OK auth.fetch_access_token! if ENV['GOOGLE_REFRESH_TOKEN'] == "0" puts("3. Save this refresh token:\n%s\n\n" % auth.refresh_token) # you can now replace the 0 in your .env file with this token, so it'll be used permanently. You can also add this to the Heroku Config Vars. ENV['GOOGLE_REFRESH_TOKEN'] = auth.refresh_token #we'll set it here, so it works without having to alter the .env file for this call end if GoogleDrive.login_with_oauth(auth.access_token) 

使用capybara并导航到令牌页面。 从页面源获取它并保存到变量。 需要时插入变量。 令牌字符串过期,所以每次我需要访问电子表格时我会抓一个新的。