2013-05-29 46 views
0

我正在開發Sinatra Web應用程序,我計劃添加Google登錄功能。如何在Sinatra中爲多個請求維護Oauth2會話有效性?

儘管我能夠理解Google的Oauth2身份驗證機制,並且一切似乎都正常,但我仍然有一個關於維護會話的基本問題。 我正在使用Oauth2的服務器端Web應用程序流程。

在我問這個問題之前,我對Oauth2認證機制有所瞭解。

一旦上了「在與谷歌」按鈕,用戶點擊,事件的順序是:

  • 用戶被重定向到谷歌OAuth授權服務器。
  • Google oauth2授權服務器會檢查用戶是否有活動的 會話。
  • 如果是,它會提示用戶授予我的應用程序對Google請求的數據的訪問權限。
  • 如果用戶授予訪問權限,則開始發回auth_code並獲取訪問令牌的過程。

根據我在網上遇到的情況,上述所有代碼都必須放在過濾器之前。

我的問題是如下:

  1. 如果我過濾器之前將此代碼添加到一個,然後會有一個往返於谷歌認證服務器對於涉及到從用戶我的應用程序的每個請求。
  2. 我在上面的陳述1中認爲是正確的嗎?
  3. 這是必要的嗎?
  4. 有沒有其他的方式來驗證會話,但沒有聯繫到我的服務器的每個請求的谷歌服務器?
  5. 這不會造成開銷嗎?
  6. 使用oauth2的web應用程序如何處理跨多個請求的會話有效性檢查?

對不起有關長期問題和感謝您的耐心等待。

回答

1

當用戶點擊登錄鏈接並返回一個有效的響應,例如request.env [「omniauth.auth」]時,您需要在會話中存儲「uid」,然後檢查下一個會話要求。像這樣

before do 
    unless ['/login', '/auth/google_oauth2/callback'].include?(action) 
    unless session[:uid] 
     redirect "/login" 
    end 
    end 
end 

get "/auth/google_oauth2/callback" do 
    session[:uid] = request.env["omniauth.auth"]["uid"] 
    redirect "/" 
end 

讓我知道它是否有效。

+0

感謝您的回答。我沒有使用Omniauth,只是Oauth2的寶石。所以在request.env中omniauth.auth哈希將不可用。但我明白你在說我在會話散列中存儲了用戶個人資料中的一些獨特信息,然後在'before do'之前檢查它。我的問題是,即使用戶從瀏覽器的另一個選項卡退出了谷歌(提供商),這是否仍然允許用戶繞過'/ login'? –

+0

閱讀http://stackoverflow.com/a/12909563,看看這是否回答你的問題 – Noop

+0

接受@ Noop的答案,因爲這指出我在正確的方向。 –