4

我需要连接到 Google Analytics。我正在使用omniauth_google_oauth2该应用程序对用户进行身份验证,这给了我一个令牌。问题是我需要连接到该用户的 Google Analytics 帐户。要将 GA 连接到我的应用程序,我使用了只有两种身份验证方法的garb gem;用户名/密码和 OAuth 令牌。当我使用omniauth_google_oauth2 提供的令牌时,它不起作用。

如何仅使用从omniauth_google_oauth2 的身份验证中获得的oauth_token 创建这个新令牌?

4

2 回答 2

2

我知道我参加这个聚会迟到了,但我解决了一个类似的问题。除非您使用支持 oauth2 的分叉 garb,否则您不能将 omniauth_google_oauth2 与 garb 一起使用。这里有一个由 Sija 维护得很好。但是,您将需要使用 oauth2 客户端对象才能使用此分叉创建会话。您可以使用 omniauth_google_oauth2 设置用户的个人资料,并确保为用户保存刷新令牌,然后当您想使用 garb 获取分析数据时,使用 oauth2 刷新令牌,然后将该对象传递到您的 garb 会话中以提取用户的数据。这是将来自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
于 2013-02-15T19:11:49.720 回答
1

我认为您遇到的问题是garb只会使用 OAuth 1(或用户名/密码组合)对用户进行身份验证,而omniauth_google_oauth2(显然)是 OAuth 2。

我发现的唯一解决方案是使用 Google 已弃用的 OAuth 1 实现,如下所示......

宝石文件:

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

然后为 构造一个 AccessToken garb

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
于 2012-07-31T19:11:45.193 回答