0

我是來自學校的一些朋友的新創業公司的一員,我正在開發REST API作爲Web應用程序/網站的後端。我最近得到了大量的項目,並且沒有太多的經驗。如何從應用程序數據中分離用戶標識

沒有詳細討論具體的商業理念,它將是一種「共享經濟」服務,例如uber或airbnb,其中用戶註冊爲特定服務的客戶或提供商。因此,用戶需要註冊一個賬戶並獲得與該賬戶相關的數據。

API是使用ASP.NET Web API開發的。對於身份驗證/授權,我使用ASP.NET Identity和JWT作爲OWIN OAuth中間件的Oauth承載令牌。

我已經使用了部分設置的指南,並進行了一些更改以適合我們的 項目。 (只要搜索「bitoftech在ASP.NET Web API和Identity 2.1中實現OAuth JSON Web令牌身份驗證」即可找到它,如果您感興趣的話)。

對於那些不知道,ASP.NET身份數據庫看起來是這樣的: ASP.NET Identity database diagram.

所以我們有一個APPUSER表表示用戶,用連接在不同的表中的角色,索賠和登錄身份數據庫。

現在,用戶在我們的應用程序中有很多與他的賬戶相關的其他數據,比如消息(用戶可以相互發送消息),事件(比如騎行,如果這是超級),類別,評論,文件和其他數據。全部在單獨的表格中。

因此,由於所有這些其他表都與用戶身份相關,我所做的就是將所有這些其他表與AppUser表中的Id的外鍵放在同一個數據庫中。

每個用戶在IdentityRole表中具有Customer或Provider(如Uber示例中的客戶或驅動程序)角色。 這樣我可以根據角色授權用戶,也可以根據角色查詢數據。

現在爲趕上:意外的需求變化。該公司已決定他們(我們)想要創建一個類似的服務(與客戶和提供商),但是在不同的業務領域以及具有相同的用戶身份。因此,已經註冊到一個站點的用戶不應該被要求再次註冊其他站點的新帳戶,而只需使用他們現有的帳戶(也可以通過點擊他們的個人資料中的某個按鈕來註冊新站點) 。

因此,如果第一個網站是超級,現在我們要創建airbnb(不是真的,但作爲一個例子)。

新網站中的數據與第一個網站非常相似。用戶將擁有消息,事件,類別,文件等。但事件表可能會有所不同,也可能是新網站的一些新表或不同表。我們會盡量保持數據非常相似,所以我們可以使用大部分現有的代碼,但是我們期望 - 如果網站變得流行 - 它們會在代碼和數據方面發生偏差(在代碼和數據方面)時間。

所以我首先想到:「我怎樣才能改變現有的數據庫模式,使它適合這兩種服務?」。但是當我想到更多的時候,我認爲這可能只會在未來造成問題。

Oauth flow diagram中,您有單獨的資源服務器和授權服務器。儘管我現在使用Oauth,但我的API既是資源服務器也是授權服務器,如果他們沒有按照我描述的方式加入,那麼這可能會好起來的。

所以經過這一切,我的問題是這樣的:

1:我應該使用一個(單獨)數據庫的用戶身份(IdentityDbContext), 和其它數據庫用於其他所有數據(事件,消息等等)?

這樣Identity可以在完全不同的服務器上運行(如果需要的話),而不是耦合到任何特定的域/站點/服務。這是一個好主意嗎?

2:如果是的話,我將如何創建數據庫之間的關係?

我能想到的唯一方法是在Uber數據庫中創建一個只有UserId(來自Identity數據庫)的獨立用戶表,並且這將在用戶第一次註冊站點時創建,並且所有其他數據都與此密鑰相關。然後,我需要從兩個數據庫中查詢數據並將它們放在一起進行一些操作,例如,當用戶查詢他的傳入消息時,消息本身將位於一個數據庫中,而發送者的名稱位於另一個數據庫中。有沒有更好的辦法?

3:我應該使用用於第一和第二網站/服務單獨的數據庫(一個用於烏伯,一個用於發現生活怎樣,如在實施例)?或者,還有更好的方法?

4:有沒有,我還沒有想過這將是更好的不同的解決方案?

很多人以前可能都遇到過這些問題,所以如果有經驗的開發人員能告訴我什麼是最佳實踐,我將不勝感激。

最後,如果我們目前的努力取得成功,未來更多的服務將「附加」到用戶身份,所以我真的需要一個面向未來的解決方案來解決這個問題。

謝謝你的回覆。

回答

0

這種做法似乎有些共同點:

  1. 保持一個完全獨立的身份數據庫。根本不應該與任何業務線(LOB)數據庫連接。

  2. 每個LOB數據庫應該有其自己的用戶表,並且具有適當的參照完整性約束以及其他LOB表,例如,事件或消息在你的情況。

  3. 當用戶第一次打你的LOB網站時,他應該被「註冊」在LOB數據庫中。插入一個LOB用戶記錄。使用訪問令牌調用身份服務器以獲取您的LOB網站需要的任何人口統計信息。

  4. 當用戶第N次訪問您的LOB網站之一時,您可以使用訪問令牌調用身份服務器並獲取最新的最新人口統計信息,以防萬一自從他上次訪問以來,情況有所改變然後,您可以將此信息存儲在LOB用戶表中,以便離線使用它,例如,如果您需要推送營銷電子郵件,您將擁有該電子郵件地址的副本。

這種方法的優點是分離問題和支持多個身份驗證提供程序的能力(例如,將來您也可以支持Facebook或Google+登錄)。

此外,您還可以避免身份服務器和LOB服務器之間的任何依賴關係,因此您可以根據需要添加或刪除業務線,並使身份服務器保持良好和輕量級。

+0

感謝您的回覆。只有幾個問題:API(LOB服務器)是完全無狀態的,那麼服務器如何知道用戶是否第N次點擊它?每次用戶記錄被更改時,讓身份服務器通知LOB服務器不是更容易嗎?也許某種觀察者模式?還是會打破關注的分離?我應該爲每個業務線使用完全獨立的數據庫(如我的第三個問題)? – BruceB

+0

由於LOB用戶表中缺少任何記錄,LOB應用程序將知道用戶是新的。如果您單獨銷售這些解決方案,您將希望避免它們之間的任何依賴關係(除了依賴於登錄協議,這是不可避免的)。 –

+0

我的問題是指用戶第N次訪問服務器,而不是第一次(您說我可以定期調用身份服務器 - 即第N次 - 檢查用戶信息是否已更新)。那麼我將如何實現?謝謝。 – BruceB

相關問題