2011-08-15 36 views
6

我已經使用Devise作爲其他項目的標準認證寶石。在另一個項目中,我使用了Devise + Omniauth進行Twitter身份驗證。可以設計+ Omniauth有幾種類型的登錄?

在一個新項目中,我需要我的最終用戶能夠通過Twitter和Facebook登錄或能夠通過應用程序註冊。將來,用戶可以將他的賬戶連接在一起。例如,他的Twitter和Facebook帳戶。或者,他的Twitter和「本地」帳戶。 「原生」是他直接通過網絡應用程序註冊的帳戶。

是否能夠這樣?如果是這樣,我們如何將用戶的賬戶連接在一起?這背後的概念是什麼?應用程序如何知道哪個Facebook和Twitter帳戶屬於哪個用戶?

想法和建議歡迎。

編輯:

我一直在下面http://railscasts.com/episodes/236-omniauth-part-2?autoplay=true什麼我不明白是。如果

  1. 用戶退出應用程序,
  2. 用戶與應用程序註冊了一個賬號,
  3. 用戶登錄與不同的服務提供商(Facebook,微博, 等)。

應用程序如何知道如何將他的新服務提供商與他已有的帳戶關聯?

Stackoverflow.com有此功能。但是他們未包含在他們的「多重簽名」功能中的一家服務提供商是Twitter。我猜這是因爲Twitter不會通過他們的API暴露用戶的電子郵件。而其他服務提供商(Facebook,雅虎,Gmail)也有。

回答

3

電子郵件通常用於鏈接所有帳戶,但通過Twitter,您無法獲得電子郵件帳戶。 使用電子郵件並不是一個好的做法,因爲用戶不一定要使用相同的電子郵件地址註冊到每個服務。

詢問用戶是否想在登錄後使用Facebook/twitter/google/openid進行身份驗證是最簡單的方法,對用戶而言更具可預測性。你必須防止「這個網站如何知道我的Facebook帳戶?爲什麼他們跟蹤我?」

作爲一個方面說明,最難的部分是不添加新的身份驗證方法,但如果用戶(例如,用戶創建了一個帶有Facebook的帳戶和一個帶有twitter的帳戶)合併帳戶。

+0

好的解釋。這是Stack Overflow不啓用Twitter身份驗證的主要原因嗎? –

+0

這可能是原因。你應該直接問管理員,這背後也可能有一個政治原因。 –

+1

由於他們使用OAuth 1.0,Stackoverflow不支持Twitter,我在博客上讀到,集成到他們當前的系統是一件痛苦的事情。有一個用戶登錄,然後添加另一個帳戶與他們的用戶名似乎是最好的技術。這就是這麼做的。 http://meta.stackexchange.com/questions/74551/enable-authentication-via-twitter-oauth – Ash

1

請認準這個截屏,它會幫助你:OmniAuth

OmniAuth part2

最近I'he有這樣的問題了作爲你現在有。我的目標是在同一時間實施許多認證解決方案:Google,Twitter,Facebook ..所以用戶可以使用多個提供商(例如在Stackoverflow.com中)登錄,並且在註銷後,他會使用其他服務登錄。我已經創造下一個架構來實現這一點(我沒有我的代碼,但現在它應該給你一個線索):

class User 
has_many :authentications 
has_many :known_authentications 
end 

class Authentication 
    #implemented nearly as in Ryan's Railscasts (It keeps authorization info) 
end 

class KnownAuthentications 
    #has :provider, :user_id, :uid and :email columns. Here I keep all authorizations for registered user, that he ever had(so I can verify user by email and guess that this is the same user as logged in from different services). I fill this table when user registers with any service(Google, Twitter etc.). 
end 

當我用戶logges檢查KnownAuthentifications表當前授權服務通過電子郵件(OpenID的服務通過電子郵件與其他參數,OAuth - 不要(所以這裏我創建假電子郵件,說[email protected] - >所以設計不通過除了))。知道我現在從Google登錄的用戶與當前從Twitter登錄的用戶相同。

+0

看我上面編輯 –

+0

檢查我更新的帖子,我希望這會給你一個線索來解決這個問題。也許我的解決方案不是很好,但它適用於我(如在Stackoverflow.com :)) – bor1s

1

設計是完全有能力如此,因爲每個供應商都有自己的令牌,你 需要一種方法來識別用戶無論使用哪個提供商,他選擇了登錄。

最常見的方式做到這一點通過使用電子郵件字段,您需要在每個提供商請求中詢問電子郵件地址 ,但我個人不喜歡它,因爲用戶仍然可能在不同的提供商中擁有不同的電子郵件。

要解決這個問題,您可以提供一個選項「將我的Facebook登錄與我的Twitter登錄連接」。

+0

看我上面的編輯 –

0

我有同樣的問題,雖然這不是一個完整的解決方案(我不認爲一個人真的是百分之百安全),這是我現在正在建設的。

示例:使用用戶名/密碼,Facebook和Twitter進行身份驗證的站點。

用戶來到該網站並想要註冊。他們使用Twitter註冊進行身份驗證。 Twitter傳遞除電子郵件地址外的一系列信息。我正在存儲我認爲可用於比較的配置文件信息(位置,名稱等)。用戶在身份驗證後立即顯示一個配置文件頁面,以驗證配置文件信息(他們可以刪除他們不想存儲的任何信息)。他們還有機會添加額外的身份驗證方法(在這種情況下,用戶名/密碼和Facebook)。您越鼓勵他們在登錄時鏈接其他身份驗證方法,您將遇到的重複帳戶的麻煩越少。然而,它仍然是一個邊緣案例。

邊緣案例情況如下:用戶使用Twitter註冊,然後立即註銷並嘗試使用Facebook登錄。登錄方法檢測到這是一個新的身份驗證,因此它將來自Facebook的oauth數據與現有配置文件信息進行比較,並嘗試查找匹配項。然後,我會顯示前10位左右的匹配項,並要求用戶驗證它們是否已經存在以便帳戶可以鏈接。讓用戶使用Twitter登錄,然後關聯Facebook帳戶。

很顯然,如果每個人都使用相同的電子郵件地址,並且Twitter實際上會返回一個電子郵件地址,那麼這會更容易,更簡單。但並非每個人都這樣做,所以你必須以最好的方式處理這個邊緣案例 - 在這一點上,我會嘗試匹配選項,並推薦用戶在註冊並填寫個人資料信息時與其他服務進行身份驗證。