我結束了編碼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令牌,但似乎超出了此答案的範圍。
是的 - 我最終做到了這一點......我添加了更多細節的答案。 –