我需要连接到Google Analytics。我正在使用omniauth_google_oauth2
通过应用程序对用户进行身份验证,这给了我一个令牌。问题是我需要连接到此用户的Google Analytics帐户。要将GA连接到我的应用程序,我使用的garb gem只有两种身份验证方法;用户名/密码和OAuth令牌。当我使用omniauth_google_oauth2提供的令牌时,它不起作用。
如何仅使用我使用omniauth_google_oauth2进行身份验证时获得的oauth_token来创建此新令牌?
答案 0 :(得分:2)
我知道我在这个方面迟到了,但我解决了类似的问题。除非使用支持oauth2的garb分叉,否则不能将omniauth_google_oauth2与garb一起使用。 Sija维护得很好here。但是,您需要使用oauth2客户端对象才能使用此fork创建会话。您可以使用omniauth_google_oauth2设置用户的个人资料,并确保为用户保存刷新令牌,然后当您想要使用garb抓取分析数据时,使用oauth2刷新令牌,然后将该对象传递到您的服务会话中以拉出用户的数据。以下是将omniauth存储在某处的refresh_token后的示例:
client = OAuth2::Client.new YOURGOOGLEAPIKEY, YOURGOOGLEAPISECRET,
{
:site => 'https://accounts.google.com',
:authorize_url => "/o/oauth2/auth",
:token_url => "/o/oauth2/token",
}
response = OAuth2::AccessToken.from_hash(client, :refresh_token => omniauth_refresh_token).refresh!
Garb::Session.access_token = response
答案 1 :(得分:1)
我认为您遇到的问题是garb
只会使用OAuth 1(或用户名/密码组合)对用户进行身份验证,而omniauth_google_oauth2
(显然)是OAuth 2。
我发现的唯一解决方案是使用Google弃用的OAuth 1实现,如下所示......
的Gemfile:
gem 'omniauth-google', :git => 'git://github.com/davidkpham/omniauth-google.git'
# This fork relaxes dependencies on omniauth itself
初始化程序(适用于Google Analytics访问权限):
provider :google, 'XXXXXXXXXXXX.apps.googleusercontent.com', 'YOUR_SECRET', scope: 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.google.com/analytics/feeds/'
在回调中,存储一些传回来的东西:
auth = request.env["omniauth.auth"]
session[:google_token] = auth.credentials.token
session[:google_secret] = auth.credentials.secret
然后为garb
构建一个AccessToken:
if session[:google_token] and session[:google_secret]
consumer = OAuth::Consumer.new('XXXXXXXXXXXX.apps.googleusercontent.com', 'YOUR_SECRET', {
:site => 'https://www.google.com',
:request_token_path => '/accounts/OAuthGetRequestToken',
:access_token_path => '/accounts/OAuthGetAccessToken',
:authorize_path => '/accounts/OAuthAuthorizeToken'
})
garbsession = Garb::Session.new
garbsession.access_token = OAuth::AccessToken.new(consumer, session[:google_token], session[:google_secret])
# Once we have an OAuth::AccessToken constructed, do fun stuff with it
ga_id = "UA-XXXXXXX-X"
profile = Garb::Management::Profile.all(garbsession).detect {|p| p.web_property_id == ga_id}
ga_monthly = GoogleAnalyticsDate.results(profile, :start_date => (Date.today - 30), :end_date => Date.today, :sort => :date)
puts ga_monthly
end