使用oauth2 ruby​​ gem离线访问谷歌联系人

时间:2015-04-14 06:07:40

标签: ruby oauth-2.0 google-contacts

我尝试使用oauth2 ruby​​ Gem(https://github.com/intridea/oauth2)离线访问Google联系人。我目前的代码是:

#!/usr/bin/env ruby

require 'oauth2'
require 'yaml'
require 'pp'

auth = YAML.load_file('.auth.yml')
client_id = auth['google']['clientid']
client_secret = auth['google']['secret']
redirect = 'urn:ietf:wg:oauth:2.0:oob'
code = ARGV[0]
token = nil

client = OAuth2::Client.new(client_id, client_secret, site: 'https://accounts.google.com', token_url: '/o/oauth2/token', authorize_url: '/o/oauth2/auth')
if code
  token = client.auth_code.get_token(code, :redirect_uri => redirect)
  auth['google']['token'] = token.to_hash
  open('.auth.yml', 'w'){|f| f.write(auth.to_yaml)}
elsif auth['google']['token']
  token = OAuth2::AccessToken.from_hash(client, auth['google']['token'])
  token.refresh! if token.expired?
  auth['google']['token'] = token.to_hash
  open('.auth.yml', 'w'){|f| f.write(auth.to_yaml)}
else
  puts client.auth_code.authorize_url(scope: 'https://www.google.com/m8/feeds', redirect_uri: redirect, access_type: :offline)
end

pp token.expired? if token

我可以使用它来获取访问令牌,有效期为一小时,我确实在我提交的代码中看到了一个refresh_token,当我从生成的URL的确认屏幕提交代码时,我只看到确认屏幕提示我访问我的联系人,它不会询问我是否要进行离线访问,并且令牌确实在一小时后过期。我做错了什么?

1 个答案:

答案 0 :(得分:0)

每个访问令牌在一小时后过期。当您不请求离线时,用户必须再次授予访问权限才能获得新的访问令牌。

如您所述,在请求离线访问令牌时,您将收到刷新令牌。您将使用此刷新令牌在其到期之前或之后请求新的访问令牌。这样做是为了使用户不会每小时都被打扰以授予访问权限。

以下是有关刷新令牌的文档:https://developers.google.com/identity/protocols/OAuth2WebServer#refresh