4

我正在使用Rails + Garb Gem(Sija分支)+ omniauth-google-oauth2 Gem和我可以使用Google Analytics API成功進行身份驗證,並提取我們的應用在使用時生成的數據用戶登錄,例如:無法獲取谷歌分析API的oAuth2訪問令牌

Garb::Session.login('USERNAME', '<PASSWORD>') 

我就可以使用裝束連接到分析簡介欲,並從中提取數據,並在網頁上顯示一些圖表。這一切工作正常。

但是,我想使用oAuth2來與Analytics進行身份驗證,這就是爲什麼我必須從Github安裝Garb Gem的Sija分支(它支持oAuth2)並且我還安裝了omniauth-google-oauth2 Gem。現在,在理論上我應該可以使用下面的代碼進行驗證:

Garb::Session.access_token = access_token # an instance of OAuth2::Client 

這是在這一點上,它變得有點朦朧了我,我將不勝感激一些指導。這裏有多遠,我已經得到了:

1)我在谷歌API控制檯創建項目和服務

2)下開啓Analytics(分析)API這爲我提供了一個客戶端ID和客戶端密鑰

3 )我碰到這個代碼,我可以與ID和祕密上面填充傳來:

client = OAuth2::Client.new(
GOOGLE_CLIENT_ID, 
GOOGLE_CLIENT_SECRET, 
{ 
    :site   => 'https://accounts.google.com', 
    :authorize_url => '/o/oauth2/auth', 
    :token_url  => '/o/oauth2/token' 
}) 

4)再有就是代碼的下位:

response = OAuth2::AccessToken.new(
    client, 
    STORED_TOKEN, { 
    refresh_token: STORED_REFRESH_TOKEN, 
    expires_at: STORED_EXPIRES_AT 
}) 

5),然後在與理論連接:

Garb::Session.access_token = response 

我是我沒有在點令牌信息(4)上面的問題。在我看來,使用oAuth2我需要做一次「握手」並打印出返回標記值?也許通過Rails代碼打印返回的值,然後將標記值粘貼到Rails應用程序中的常量中,以便我可以在上面的代碼中使用它們?我真的很困惑。正如我前面提到的,使用用戶登錄身份驗證,Web應用程序可以正常工作。所有網絡應用程序正在執行分析驗證,拉下一些數據並繪製圖表。但我堅持把它轉換爲oAuth2作爲我只是不知道如何獲得Garb Gem正在尋找的訪問令牌。我還應該注意到,這不是一個有多個用戶認證的公共網站,這是一個連接到我們自己的Google Analytics數據的CMS網站。

我已經看到了這方面的一些部分片段,但沒有一個完整解釋或工作的例子。我真的很感謝任何指導和幫助解決這個問題。

很多感謝,

JR

回答

5

我已經通過這個當過兵,在過去的幾周裏,所以讓我分擔什麼工作:

要使用的OAuth2你需要得到一個'刷新令牌「,每次您進行API調用時,您都會使用它來」重新驗證「谷歌。步驟如下:

1)在API控制檯中設置您的帳戶 - https://code.google.com/apis/console/b/0/(看起來您已經做得很好) 2)在您的API帳戶中,確保您有一個重定向URI指向返回您的應用程序:

http://some-url.com/auth/google_oauth2/callback 
http://localhost:3000/auth/google_oauth2/callback 

注意這裏,谷歌將不會讓你爲0.0.0.0:3000回調到本地機器...所以你需要使用localhost明確

3)在您的路由文件中,將url重定向到控制器中您要創建項目或身份驗證的操作

match '/auth/:provider/callback' => 'authentications#create' 

':provider'只是讓你匹配多種類型的oauth,但你也可以在那裏放置'google_oauth2'。

4)現在,在你的控制器

def create 
    auth = request.env["omniauth.auth"] 
    params = request.env["omniauth.params"] 
    project = Project.find(params['project_id']) 

    Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token']) 
    flash[:notice] = "Authentication successful." 
    redirect_to owner_view_project_path(project) 
end 

5)創建一個動作控制器動作應檢索響應對象的相關字段這裏響應對象(詳見:https://github.com/zquestz/omniauth-google-oauth2) - 特別是,您需要獲取'refresh_token'並將其保存到項目或認證對象中 - 如果您尚未向所需對象添加'access_token'屬性,請立即執行遷移,然後開始將刷新標記保存到該屬性中

6)現在,當您準備好調用特定身份驗證並獲取API da TA吧,你可以加載該對象在保存該訪問令牌,並使用與谷歌API來獲取一個新的會話如下:

@authentication = Authentications.find(params[:id]) 

    client = OAuth2::Client.new GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, 
            { 
            :site => 'https://accounts.google.com', 
            :authorize_url => "/o/oauth2/auth", 
            :token_url => "/o/oauth2/token", 
            } 
    response = OAuth2::AccessToken.from_hash(client, :refresh_token => @authentication.access_token).refresh! 
    Garb::Session.access_token = response 
    @profiles = Garb::Management::Profile.all 

這段代碼所做的就是建立OAuth2訪問令牌(響應)通過指定客戶端,然後一個refresh_token,然後調用'刷新!'獲取刷新的訪問令牌...然後使用該訪問令牌建立Garb會話,然後使用Gard :: Management :: Profile調用給定帳戶的所有配置文件。

希望這有助於 - 讓我知道你是否有問題!

+0

非常感謝您的詳細解答。實際上,我使用相同的Rails,但使用cURL來獲取訪問/刷新令牌。我直到現在才被允許回答我自己的問題,所以我會在下面給出答案,並將其標記爲正確。再次歡呼! – 2013-05-13 08:24:43

+0

我做了同樣的,我得到這個錯誤*** OAuth2 ::錯誤異常:<?xml version =「1.0」encoding =「UTF-8」?> GDatainsufficientPermissions Permission Permission RailsEnthusiast 2013-05-29 10:44:50

3

對我什麼工作剛一說明:

對於步驟3,4 & 5我用捲曲,而不是檢索訪問/刷新標記。第6步對我來說是一樣的(使用Garb Gem的Sija分支)。使用curl:

使用與您的谷歌應用程序POST相關的下列使用cURL細節:

curl --data "code=<APP_CODE>&redirect_uri=http://localhost:3000/oauth2callback&client_id=<CLIENT_ID>.apps.googleusercontent.com&scope=&client_secret=<CLIENT_SECRET>&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token 

響應採取以下形式:

{ 
    "access_token" : "<ACCESS_TOKEN>", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "<REFRESH_TOKEN>" 
} 

,你可以插入裝束寶石根據第6部分。

1

@CamNorgate的答案是有效的。

如果沒有 「refresh_token」 從Omniauth回到了回調確保您正確初始化:google_oauth2

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"], 
    { :scope=>"https://www.google.com/m8/feeds, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile", 
     :approval_prompt=>"force", access_type="offline" 
    } 

end 

確保包括:approval_prompt => 「力」,ACCESS_TYPE = 「離線」以便將refresh_token發送回去。 The refresh_token is only provided on the first authorization from the user