2012-06-02 127 views
4

我需要連接到Google Analytics。我使用omniauth_google_oauth2來驗證與應用程序的用戶,這給了我一個令牌。問題是我需要連接到此用戶的Google Analytics帳戶。要將GA連接到我的應用程序,我使用了garb gem,它只有兩種身份驗證方法;用戶名/密碼和OAuth令牌。當我使用omniauth_google_oauth2提供的令牌時,它不起作用。如何將garb與來自omniauth_google_oauth2的令牌連接起來?

如何僅使用通過omniauth_google_oauth2進行身份驗證所獲得的oauth_token來創建此新令牌?

回答

1

我覺得您遇到的問題是,garb只會驗證使用OAuth 1(或用戶名/密碼組合)的用戶,而omniauth_google_oauth2是(明顯)的OAuth 2

我唯一的解決辦法已經找到的使用谷歌的已過時的OAuth 1的情況如下...

的Gemfile:

gem 'omniauth-google', :git => 'git://github.com/davidkpham/omniauth-google.git' 
# This fork relaxes dependencies on omniauth itself 

初始化程序(用於谷歌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 
+0

感謝偉大的答案,它救了一噸的我的時間。如果任何人有配置麻煩,我有一個示例應用程序,部分基於這個答案:https://github.com/eicca/ga_test –

+0

這是否仍然工作?我使用Signet爲服務帳戶獲取OAuth2訪問令牌(因爲我需要服務器到服務器),然後創建一個新的Garb :: Session對象並以與答案相同的方式爲其分配訪問令牌。我收到一個'Garb :: Management :: Profile.all(garbsession)'的錯誤' –

2

我知道我遲到了這個一但我解決了類似的問題。除非使用支持oauth2的garb叉子,否則不能使用garb的omniauth_google_oauth2。有一個here由Sija很好維護。但是,您需要使用oauth2客戶端對象才能使用此叉創建會話。您可以使用omniauth_google_oauth2設置用戶的個人資料,並確保爲用戶保存刷新令牌,然後當您想用garb獲取分析數據時,使用oauth2刷新令牌,然後將該對象傳遞到服裝會話中,以便將用戶的數據。這裏有一個例子,你有refresh_token之後,從omniauth存儲的地方:

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

我很樂意爲你做一點點擴展。我認爲與Sija的Garb叉的OAuth2是解決這個問題的正確方法。我似乎無法將此取消。 – adamb0mb

+0

你有什麼特別的問題嗎?它是從omniauth_google_oauth2獲取refresh_token,刷新它,設置sija的fork還是使用刷新響應來啓動garb會話? – topher

+0

我想通了......我想我只是有問題使它與'irb'一起工作。你的代碼片段是現貨。 – adamb0mb

相關問題