OAuth和Google让我很困惑 . 我花了很长时间才得到refresh_token来创建一个新的access_token . 然后找出refresh_token也过期了?有什么意义!!!
我需要做的就是坚持使用有效的access_token与legato一起使用 .
以下是我手动输入终端以检索OAUTH代码的内容:
client = OAuth2::Client.new('GA_CLIENT_ID', 'GA_SECRET_KEY', {
:authorize_url => 'https://accounts.google.com/o/oauth2/auth',
:token_url => 'https://accounts.google.com/o/oauth2/token'
})
client.auth_code.authorize_url({
:scope => 'https://www.googleapis.com/auth/analytics.readonly',
:redirect_uri => 'http://localhost',
:access_type => 'offline',
:approval_prompt=> 'force'
})
然后我在浏览器中手动输入输出的URL . 我将返回的OAUTH代码导出为env变量并获取访问令牌:
access_token = client.auth_code.get_token(ENV['GA_OAUTH_CODE'], :redirect_uri => 'http://localhost')
然后我可以访问access_token和refresh_token:
begin
api_client_obj = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {:site => 'https://www.googleapis.com'})
api_access_token_obj = OAuth2::AccessToken.new(api_client_obj, ENV['GA_OAUTH_ACCESS_TOKEN'])
self.user = Legato::User.new(api_access_token_obj)
self.user.web_properties.first # this tests the access code and throws an exception if invalid
rescue Exception => e
refresh_token
end
end
def refresh_token
refresh_client_obj = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {
:authorize_url => 'https://accounts.google.com/o/oauth2/auth',
:token_url => 'https://accounts.google.com/o/oauth2/token'
})
refresh_access_token_obj = OAuth2::AccessToken.new(refresh_client_obj, ENV['GA_OAUTH_ACCESS_TOKEN'], {refresh_token: ENV['GA_OAUTH_REFRESH_TOKEN']})
refresh_access_token_obj.refresh!
self.user = Legato::User.new(refresh_access_token_obj)
end
一小时后,我的令牌过期,我必须从浏览器再次手动启动该过程!我怎么能在代码中复制这个?
1 回答
在这里,你做了一些适合你的东西:)
这是一个简单的实现,专门用于缓解更新令牌的痛苦 .
请务必:
加入你自己的
APP_ID
和APP_SECRET
.每次只保存
refresh_token
并在使用之前调用refresh_token()
,或每次使用refresh_token_if_needed()
,并重新保存token
和expires_at
(显然首选,因为您只需在需要时刷新) .让我知道它是如何运作的 .
.