如何将用户标识与应用程序数据解耦



我和一些学校的朋友一起加入了一家新的初创公司,我正在开发一个REST API作为web应用程序/网站的后端。我最近刚毕业,对大型项目没有太多经验。

如果不详细介绍具体的商业理念,它将是一种"共享经济"服务,比如uber或airbnb,用户注册为特定服务的客户或提供商。因此,用户需要注册一个帐户,并拥有与该帐户相关的数据。

API是用ASP.NET Web API开发的。对于身份验证/授权,我使用ASP.NET Identity和JWT作为OWIN Oauth中间件的Oauth承载令牌。

我使用了部分设置指南,并进行了一些更改以适应我们的项目(如果您感兴趣,只需搜索"bitoftech Implement OAuth JSON Web Tokens Authentication in ASP.NET Web API and Identity 2.1"即可找到它)。

对于那些不知道的人来说,ASP.NET Identity数据库如下所示:ASP.NET标识数据库关系图。

因此,我们有一个表示用户的AppUser表,在Identity数据库的不同表中附加了角色、声明和登录名。

现在,用户在我们的应用程序中有许多其他与他的帐户相关的数据,如消息(用户可以相互发送消息)、事件(如果这是uber,则为乘车)、类别、评论、文件和其他数据。所有这些都在单独的表格中。

因此,由于所有这些其他表都与用户标识相关,所以我所做的是将所有这些其他表格放在同一个数据库中,并在AppUser表中使用Id的外键。

在IdentityRole表中,每个用户都有一个Customer或Provider角色(如Uber示例中的Customer或driver)。通过这种方式,我可以根据角色授权用户,也可以根据角色查询数据。

现在抓住问题:意外的需求更改。该公司决定,他们(我们)希望创建类似的服务(与客户和提供商),但在不同的业务领域,使用相同的用户身份。因此,已经在一个网站注册的用户不应该被要求再次使用另一个网站的新帐户注册,而只需要使用他们现有的帐户(也许可以通过单击个人资料中的按钮或其他方式注册新网站)。

所以,如果第一个网站是uber,现在我们想创建airbnb(不是真的,但作为一个例子)。

新站点中的数据将与第一个站点非常相似。用户会有消息、事件、类别、文件等。但事件表可能会有点不同,可能会为新网站提供一些新的或不同的表。起初,我们会尽量保持数据非常相似,这样我们就可以使用大部分现有的代码,但我们预计,如果网站变得流行,它们会随着时间的推移(在代码和数据方面)逐渐分离。

因此,我首先想到:"如何更改现有的数据库模式,使其适合两种服务?"。但当我仔细思考时,我认为这可能只会在未来制造问题。

在Oauth流程图中,您有一个单独的资源服务器和授权服务器。尽管我现在使用Oauth,但我想我的API既是资源服务器又是授权服务器,如果它们没有按照我描述的方式耦合,那可能没问题?

所以我的问题是:

1: 我应该为用户标识(IdentityDbContext)使用一个(单独的)数据库吗,以及用于所有其他数据(事件、消息等)的另一个数据库

这样,如果需要,Identity就可以在完全不同的服务器上运行,而不必耦合到任何特定的域/站点/服务。这是个好主意吗?

2: 如果是,我将如何在数据库之间创建关系

我唯一能想到的就是在"优步"数据库中创建一个单独的用户表,其中只有UserId(来自Identity数据库),这将在用户第一次注册网站时创建,所有其他数据都与该密钥相关。然后,我需要从两个数据库中查询数据,并将它们放在一起进行一些操作,例如,当用户查询其传入消息时,消息本身将在一个数据库中,而发件人的名称将在另一个数据库。有更好的方法吗?

3: 我应该为第一个和第二个网站/服务使用单独的数据库吗(一个用于优步,一个用于Airbnb,如示例所示)?或者有更好的方法吗

4: 有没有其他我没有想过的解决方案会更好

很多人以前可能都遇到过这些问题,所以如果有经验丰富的开发人员能告诉我什么是最佳实践,我将不胜感激。

最后,如果我们目前的目标成功,未来会有更多的服务"附加"到用户身份上,这并非不可能,所以我真的需要一个经得起未来考验的解决方案来解决这个问题。

感谢您的回复。

这种方法似乎有些常见:

  1. 维护一个完全独立的身份数据库。不应与任何业务线(LOB)数据库建立任何连接。

  2. 每个LOB数据库都应该有自己的用户表,并与其他LOB表(例如您的案例中的事件或消息)具有适当的引用完整性约束。

  3. 当用户第一次访问您的LOB网站时,他应该被"注册"到LOB数据库中。将插入LOB用户记录。使用访问令牌调用身份服务器以获取LOB站点所需的任何人口统计信息。

  4. 当用户第N次访问您的LOB网站时,您可以使用访问令牌调用身份服务器并获取最新的人口统计信息,以防自上次访问以来任何信息发生更改。然后,您可以将这些信息存储在LOB用户表中,以便脱机使用,例如,如果您需要推送营销电子邮件,您将获得电子邮件地址的副本。

这种方法的优点是分离了问题,并且能够支持多个身份验证提供商(例如,将来您也可以支持Facebook或Google+登录)。

此外,您还可以避免身份服务器和LOB服务器之间的任何依赖关系,因此您可以根据需要添加或删除业务线,并保持身份服务器的美观和轻量级。

最新更新