Ruby google_drive gem oAuth2节省

时间:2014-11-06 21:34:31

标签: ruby oauth google-drive-api

所以在更新之前有一种简单的方法来登录谷歌驱动器并操纵你的谷歌文档 - 使用红宝石。

在您使用此功能登录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 page,看看谷歌是如何让我们使用高级语言的服务,并发现他们希望我们使用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变量并在我的脚本中硬编码。

4 个答案:

答案 0 :(得分:8)

我发现了这个烂摊子。

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

auth.scope缺少一个网址。来自github的REFERENCE

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 

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

您需要做的就是在第一个实例中提供授权代码时保存 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, e.g. 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)

答案 3 :(得分:0)

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