2013-05-31 71 views
2

我正在使用gem OAuth2與Google服務進行通信。我不明白如何實現一個回調,該回調接收用OAuth代碼獲取訪問令牌的響應。當我在callback方法中設置斷點時,它似乎永遠不會被調用。如何爲oauth回調配置路由

這裏是我的代碼:

路線:

match '/oauth2/callback' => 'reports#callback' 

實際的重定向URL:

http://localhost/oauth2/callback?code=111111 

ReportsController:

def new 
client = 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' 
    }) 
redirect_to client.auth_code.authorize_url({ 
     :scope => 'https://www.googleapis.com/auth/analytics.readonly', 
     :redirect_uri => 'http://localhost/oauth2/callback', 
     :access_type => 'offline' 
    }) 
end 

def callback 
    oauth_code = params[:code] 

    # Create access token with oauth_code 
end 

回答

4

谷歌服務器嘗試訪問此網址http://localhost/oauth2/callback?code=111111這是無效的。

您需要一個域名才能使用OAuth等服務,因爲Google服務器必須能夠通過互聯網找到您的計算機。

爲了能夠從開發機器,你應該這樣做:

  1. 設置一個已知的DNS服務器上的名稱:要做到這一點,最簡單的方法是通過像dyndns或動態DNS服務器no-ip

  2. 如果您是使用NAT路由器後面,您可能需要在端口80的請求您的調制解調器重定向到您的計算機:如果你不這樣做,你的調制解調器將從谷歌接收80端口的包,並會說「不適合我」,丟棄它。您可以在調制解調器菜單中執行此操作 - 查找端口轉發或NAT部分。

+0

這是有道理的,但是當我將重定向url更改爲'http:// SITE_NAME/oauth2/callback'並在我的生產環境中測試時,從不會觸發回調。我確保使用我的生產client_id和谷歌API控制檯的祕密,以及匹配的重定向網址。我甚至會在生產日誌中添加'approval_prompt =>'force'' – mnort9

+0

@ mnort9,但沒有任何內容,就像無法路由的東西一樣?有兩件事情可能發生:1)Google沒有向您發送任何請求,或者2)它發送錯誤的請求,並且出現路由錯誤。我建議還嘗試在生產環境中加載控制檯,並手動嘗試OAuth調用,以查看是否可以發現錯誤。 – fotanus

+0

好的,我在生產中得到了這個工作。我會盡快在本地測試你的方法。 – mnort9

1

傳遞到Google從客戶端的瀏覽器看到的正是回調URL必須匹配REDIRECT_URL。在url中使用localhost沒有問題(有關DNS和NAT的fotanus句子是錯誤的)。如果您在不同的端口上運行你的容器(如8080),你必須:

  • 指定在谷歌雲的網址:http://localhost:8080/oauth2/callback

  • 指定在客戶端請求相同的返回URL。