2016-10-28 110 views
1

我有兩個使用devise進行認證的Rails應用程序:一個網站和一個API。儘管我是這兩個應用程序的所有者,但出於很多原因,我希望兩者完全分離。當用戶在網站上註冊時,會在API端自動創建一個帳戶。我遇到的最大問題是讓用戶表在兩個應用程序之間保持同步。我最終在網站用戶模型上創建了一堆RESTful API回調,它們創建/更新了API用戶。如何基於設計加密密碼進行身份驗證?

第二部分代表登錄到網站的用戶調用API。問題是我沒有用戶的解密密碼,所以我可以進行API調用。所有的API調用都使用基本的HTTP認證。密碼被散列到數據庫中,不能解密(這是一件好事,謝謝設計)。因爲我保持所有用戶列在兩個數據庫之間同步,所以我的網站用戶encrypted_pa​​ssword列與我的API用戶encrypted_pa​​ssword列完全相同。

那麼,我有什麼選擇來解決這個問題?我正在考慮修改API,以便每個常規調用的管理員調用都需要管理員用戶名和密碼以及用戶標識(例如,獲取該用戶的事務)。或者,在兩個應用程序之間實現一個共享數據庫 - 但是我有很多用戶和其他模型之間的關聯......索引甚至會如何工作?!或者,劫持設計認證並比較encrypted_pa​​ssword(從我的網站)到encrypted_pa​​ssword(我的API) - 因爲它們完全相同;但是這會打開蠕蟲的安全防護。或者,創建密鑰身份驗證併爲用戶生成唯一的GUID ...但這樣做與解密存儲在數據庫中的密碼一樣糟糕。我討厭所有這些解決方案。也許有人有更好的主意?

回答

2

當您在設計中驗證用戶時,它將使用明文密碼並將其與辣椒組合並通過bcrypt傳遞。如果已加密的密碼與DB中的值匹配,則返回記錄。

胡椒是基於你的鐵軌應用程序的祕密。因此,除非兩個應用程序具有完全相同的密碼,否則即使您擁有正確的加密密碼,身份驗證也會失敗。請記住,bcrypt的輸入必須相同才能得到相同的結果。這意味着相同的明文,鹽,胡椒和延伸數量。

你是正確的,來回共享密碼不是一個可靠的解決方案。你也是正確的,因爲使用UUID而不是數字自動遞增ID是解決方案的一部分。

你可以做的是實現你自己的認證提供者。 Gatekeeper gem使安裝您自己的OAuth提供者變得非常容易(或者如果使用外部服務,則可以使用Auth0)。

Web應用程序將使用Devise + OmniAuth根據身份驗證提供程序對用戶進行身份驗證,並使用返回的憑據在Web應用程序中標識用戶。

對於API應用程序,我會使用Knock進行JWT身份驗證。 API服務器通過oauth gem代理到您的認證服務器。

但是現在應該考慮您的web和API應用是否應該在單獨的數據庫上運行。在兩個數據庫中保持寫入同步可能是一項非常艱鉅的任務,您應該問自己,在這個階段您是否真的需要它。

+0

感謝您的所有想法。我最終沒有共享數據庫,因爲在Rails世界中,當你考慮遷移時,這是一件很痛苦的事情。另外,我最終沒有使用JWT,因爲我已經閱讀了許多文章,他們不應該在您使用Devise時使用它們。另外,對於我來說,OmniAuth沒有意義,因爲我需要擁有所有用戶的詳細信息(姓名,地址,信用卡等),所以我無法使用Facebook/Twitter。我想生成自己的令牌,但我認爲OAuth是過度殺毒,所以我最終將simple_token_authentication與Devise集成在一起。謝謝! –

+0

還有一點評論。我設計身份驗證的方式是這樣的:當用戶登錄到網站時,我暫時可以訪問密碼。在那短暫的時刻,我打電話給API,並要求一個令牌。然後令牌在整個網站會話中使用。它在用戶註銷時或在一段時間後過期(在API一側)。 –

0

JWTs可以很容易地在JWT中包含諸如用戶標識權限等信息,而不依賴於用戶表等外部持久性。只需確保令牌的簽名是正確的,並且不要在其中存儲個人信息,例如電子郵件,因爲通常JWT沒有加密,只有簽名。

我真的寫了一篇關於這方面的教程,如果感興趣的話。 https://www.moesif.com/blog/technical/restful-apis/Authorization-on-RESTful-APIs/

+0

謝謝。我對智威湯遜知之甚少。我最終沒有使用它們(見上文)。 –

相關問題