2011-10-05 50 views
3

我正在編寫一個Rails 3.1應用程序,使用Clearance進行身份驗證。我想添加標準的Facebook身份驗證:允許用戶直接(使用Clearance)或通過FB繼續註冊/驗證身份;如果他們通過FB登錄/註冊並且我們已經有相關電子郵件地址的帳戶,請合併這些帳戶。使用Clearance的Rails應用程序的Facebook驗證?

使用OmniAuth/Devise有很好的文檔,但我還沒有發現任何類似的Clearance。是否有(積極維護)寶石在這裏幫助,甚至只是教程?迄今爲止我發現的最好的是BlueLightSpecial,但它的FB Connect所使用的Gem都不再被主動維護。

回答

0

Devise/OmniAuth的優點是它與其他API(Twitter,Facebook等)的無縫集成。

您可以嘗試使用現有的寶石來製作您自己的Clearance自定義集成。例如:https://github.com/nsanta/fbgraph(雖然這個寶石暫時還沒有保留)。仍然運作良好。

還有考拉https://github.com/arsduo/koala - 與OAuth身份驗證和Facebook圖形API一起工作。

+0

是的 - 我最終做到了這一點......我添加了更多細節的答案。 –

6

我結束了編碼this solution - 發佈它在這裏,以防萬一它可以幫助別人(或其他人有改善它的建議)。

這裏的一些邏輯:

該應用程序最初是用間隙認證/授權而建,間隙,堅持讓現有名稱/殘疾人士和現有的授權碼繼續工作。

用戶標識
清除使用電子郵件地址作爲主標識符。該應用程序需要每個用戶都有一個用於其他用途的電子郵件地址,因此我們將繼續使用電子郵件作爲主用戶ID。我們在用戶註冊時從FB抓取它,如果它們通過FB註冊的話。 (請注意,omniauth-facebook請求一組可配置的FB權限;默認情況下包含對電子郵件地址的訪問)。

用戶註冊
新用戶具有創建電子郵件/密碼組合,或通過FB的註冊的選擇。 Omniauth-Facebook用於對FB進行身份驗證(並允許隨着時間的推移擴展到其他身份驗證系統)。我們從FB獲取用戶數據(姓名,電子郵件等),以及Facebook身份驗證令牌。通過這種方式驗證的用戶不需要提供密碼。選擇不使用FB註冊的用戶將提供電子郵件地址,密碼和其他用戶數據。由FB登錄創建的用戶將被帶到用戶/編輯部門,完成提供我們無法從FB抓取的任何配置文件詳細信息。我們還保留現有的用戶註冊機制,允許用戶手動提供電子郵件/密碼/其他詳細信息。

用戶驗證
Clearance將驗證用戶的電子郵件地址。我們重寫的password_optional?函數基本上繞過了他們的密碼驗證。供生產使用,這個解決方案應該包括用戶驗證,以實現「你必須有一個有效的PWD或有效omniauth creds」至少一個

Session創建
用於清除的會話模型(在存儲remember_token曲奇餅)。

會話控制器被覆蓋以添加通過FB進行簽名的方法。從FB路線回調此方法,它創建/更新用戶的身份驗證數據,並要求清理的sign_in(用戶)

授權
間隙的簡單模型被保留:「授權」過濾器基本上是隻檢查一個有效的用戶登錄in,並提供current_user helper。

FB使用
用戶的FB令牌FB認證(在belongs_to的用戶認證對象)之後存儲。 Koala用於其他FB請求(例如張貼到用戶的牆上)...在此處省略詳細信息;我沒有做任何特別的事情。

FB令牌刷新
FB令牌定期過期(和FB的 「離線訪問」 的作用已經過時)。當用戶登錄時刷新令牌,但在應用會話過期之前(當用戶註銷FB,更改其FB密碼或令牌到期時),令牌可能會失效。我正在努力如何定期更新登錄流程外的FB令牌,但似乎超出了此答案的範圍。

+0

也值得注意的是,這段代碼並不處理來自FB的auth故障......以便在生產中使用,爲失敗的omniauth調用添加適當的處理程序。 Omniauth將失敗路由到/ auth/failure,並將錯誤放入一個名爲「message」的參數中。在routes.rb中創建一個處理錯誤並將其路由/ auth/failure的動作。 –

+0

優秀的帖子,@steve bourne –

相關問題