我正在使用脚本来使用google contacts api gem获取Google联系人。我可以使用以下代码成功访问令牌:
require 'rubygems'
require 'launchy'
require 'oauth2'
require 'googlecontacts'
require 'google_contacts_api'
# Get your credentials from the console
CLIENT_ID = 'your Id'
CLIENT_SECRET = 'your Secret'
OAUTH_SCOPE = 'https://www.google.com/m8/feeds'
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET,site: 'https://accounts.google.com',token_url: '/o/oauth2/token', authorize_url: '/o/oauth2/auth')
url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, redirect_uri: REDIRECT_URI)
Launchy.open(url)
$stdout.write "Enter authorization code: "
code = gets.chomp
token = client.auth_code.get_token(code, :redirect_uri => REDIRECT_URI)
问题:
我知道这不是最好的方法,因为它很累人。每次我运行脚本时,用户都会给出访问说明。此外,我还必须手动将令牌从浏览器粘贴到终端。
问题:
如何能够存储检索到的令牌,当它过期时如何刷新它?
答案 0 :(得分:7)
您似乎正在使用oauth2 library来获取访问令牌。 AccessToken class有to_hash()
和from_hash()
方法,您可以使用这些方法对令牌进行序列化和反序列化,以及refresh()
方法一旦访问令牌过期,请刷新访问令牌。如果这是一个命令行脚本,您可以使用用户主目录中的隐藏文件来存储序列化标记。
答案 1 :(得分:3)
在第一次身份验证期间,您获得了授权令牌和刷新令牌。
存储refresh_token(在会话中,如果它是一个Web应用程序,或任何其他" volatile"持久性方案,或者最后一种情况在数据库中)。
使用refresh_token,请求Google OAuth2 WebServer documentation中描述的新令牌。
如果这不是网络服务器应用程序,也许您应该考虑使用其他OAuth2 authentication flows。
答案 2 :(得分:1)
要获得刷新令牌,您需要alter the url。
OAuth2中的:
url = client.auth_code.authorize_url(scope: OAUTH_SCOPE, access_type: "offline", redirect_uri: REDIRECT_URI)
然后它会像Erik Koleda提到的那样可用。