2014-04-17 106 views
1

我已經在Ruby中使用Faraday實現了我自己的類,以通過OAuth處理授權給GitHub。我驗證過下列條件:GitHub OAuth授權請求不會重定向到授權應用程序頁面

  • 沒有登錄到GitHub的
  • 沒有令牌存在應用

是通過GET授權請求"/login/oauth/authorize"用隨機變量state

  • 重定向到GitHub的登錄頁面
  • 重定向到授權應用程序頁面登錄後
  • 授權
  • 會迴應的access_token後執行回調到我的臨時代碼的應用程序時,我POST"/login/oauth/access_token"臨時代碼

我的問題是,當我改變第一個條件,我還沒有登錄到GitHub。相同的GET請求被髮送到GitHub,我看到正確的URL和正確的參數。然後我看到GitHub的參數return_to似乎是正確的重定向,但它很快就會重新導向回到GitHub主頁。

我希望這很容易就像忘記頭部參數或其他東西,有人可能馬上發現問題。無論如何,任何幫助表示讚賞...

代碼設置法拉第連接:

def connection 
    @connection ||= Faraday.new(url: 'https://github.com') do |faraday| 
    faraday.request :url_encoded 
    faraday.response :logger 
    faraday.adapter Faraday.default_adapter 
    end 
end 

代碼發送的授權請求:

def request_authorization(client_id, redirect_uri, redirect_id, scope, expected_state) 
    response = connection.get '/login/oauth/authorize', { 
    client_id: client_id, 
    redirect_uri: "#{redirect_uri}?id=#{redirect_id}", 
    scope: scope, 
    state: expected_state 
    } 

    if response.status == 302 
    response.headers[:location] 
    else 
    nil 
    end 
end 

我沒有顯示的代碼,但我的控制器重定向到來自request_authorization()的URL回覆。同樣,在這兩種情況下,我都能看到來自控制器的重定向,但第二種情況似乎遇到了GitHub在重定向請求中不喜歡的東西。我假設它然後重定向到主頁,並且從不回覆我的應用程序,因爲我的原始請求中存在未知問題。

謝謝, 大衛

+0

嘿大衛!你能用curl -v調用重現這個問題嗎?如果是這樣,請將這些詳細信息發送到[email protected],以便我們可以查看。 –

+0

非常有趣......經過更多的curl和RequestBin調試後,我發現GitHub主頁確實包含一個實際沒有顯示的錯誤。在HTML主體的末尾有一個ajax-error-message div,它表示「請求出錯了,請重試。」我將總結所有調試信息併發送給GitHub支持。一旦完成解決,我也會在這裏更新結果。 – dmulter

回答

1

伊萬從GitHub是找到了答案,我的問題有很大的幫助。我認爲問題是使用法拉第或OAuth的一些細節,但事實證明這個問題是一個基本的假設,證明是錯誤的。希望這會幫助那些陷入類似誤解的人。

我假設我想要連接到GitHub(或其他OAuth服務)的應用程序的用戶會向我的應用程序發出類似「連接」請求的內容。然後,我的應用程序會向GitHub生成OAuth授權請求,處理任何重定向,並最終結束向用戶提交授權應用程序頁面以供接受。

原來我只是想讓「連接」請求實際上是一個鏈接,直接向GitHub發出授權請求。我的應用程序只需要擔心處理回調,它已經做了。更容易,現在可以在所有情況下工作。

由於這種情況很簡單,因此在未登錄時發現錯誤的方法。它在登錄時失敗,因爲我沒有處理通常瀏覽器會提供的會話狀態。

對OAuth RFC進行更仔細的閱讀,清楚了我對於爲用戶代理和客戶端處理請求和響應的困惑。

相關問題