2013-02-27 59 views
0

因此,在我的Rails應用程序中使用Omniauth設置OAuth時,我遇到了以下意外行爲。強制Omniauth/OAuth忽略瀏覽器緩存並重新進行驗證?

當用戶先前已向OAuth提供程序(例如Facebook)進行身份驗證時,憑據會存儲在瀏覽器的某處。如果其他用戶嘗試在同一瀏覽器中發出OAuth請求,則會使用第一位用戶存儲的數據!

有沒有辦法強制OAuth請求不使用存儲的憑證,並讓用戶每次授權應用程序?

我已經嘗試使用下面的代碼將no-cache標題添加到控制器,但它當然沒有做任何事情,因爲請求是提供者OAuth端點,而不是我的應用程序的內部任何位置。

before_filter :set_cache_buster 

    def set_cache_buster 
    p "CACHE BBBBUSTED!" 
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0,must-revalidate" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
    request.headers["Cache-Control"] = "no-cache, no-store, max-age=0,must-revalidate" 
    request.headers["Pragma"] = "no-cache" 
    request.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
    end 

任何想法?

+0

我有同樣的問題,但與google_oauth2。實際上,我希望讓用戶決定是否要重置自動登錄。你是如何解決這個問題的? – 2013-04-11 21:24:59

+0

@FernandoFabreti這些是我似乎工作的google_oauth2 Omniauth設置:''::scope =>「userinfo.email,userinfo.profile,plus.me」, :approval_prompt =>「force」, :access_type =>「離線「''' – thoughtpunch 2013-04-12 16:20:27

回答

1

如果我理解正確,您可以通過Omniauth使用Facebook憑證登錄。並且,在您離開您的應用程序後,用戶仍會使用Facebook(不是您的應用程序,而不是OAuth,因此傾銷您的Cookie將無濟於事)進行身份驗證。所以,下次嘗試登錄到您的應用程序時(點擊「與Facebook登錄」鏈接/按鈕),Facebook不會詢問任何內容(用戶已經獲得Facebook授權,應用程序權限也已到位)並簡單地返回憑據,所以你的應用程序繼續前進,並讓你以前的用戶英寸

我想,你需要的是每次從應用程序註銷時從Facebook註銷。例如,查看這個railscast,在一個方法中處理:http://railscasts.com/episodes/360-facebook-authentication?view=asciicast。但是你必須分別處理每個提供者(twitter,...)。或者你可以嘗試找到&在你的瀏覽器中清除facebook的持久cookie(afaik,facebook使用持久cookie實現「記住我」,但我不是專家,我從來沒有必要去研究它)。

我唯一的其他的評論是,生產這種行爲是可取 - 只要是相同的操作系統用戶和用戶保持在嘰嘰喳喳/ Facebook的等你的應用程序還假定它是相同的用戶身份驗證。如果您需要在操作系統中更改用戶 - 註銷/登錄,或者您可以訪問下一個應用,臉書以及設置了「記住我」的其他Web服務,並且您尚未註銷。對於自動測試,根本不應該有這個問題,因爲cookie(會話和持久性)不會在測試之間持續存在。

雖然,我可以看到這可能是一個手動測試的問題。但手動是手動 - 只需手動從Facebook登出,你應該沒問題。

這一切只是我的猜測根據您的描述。所以,沒有保證,但希望有所幫助,至少在某些方面。