App客户端身份验证(登录)和CQRS

时间:2017-11-21 22:09:49

标签: authentication cqrs event-sourcing

当使用CQRS模式构建系统时,我对Web应用程序中的身份验证/登录的实际场景感兴趣。

假设我们将HTTP服务用于命令/查询。使用JWT(或任何其他身份验证令牌)进行身份验证

  • 我们发送带有凭据(HTTP请求)的命令LogInUser
  • 服务器命令处理程序检查凭据,在商店中写入事件(如果使用事件源)。

然后呢?作为命令的结果我们应该返回什么?只有authToken的结果好吗?然后客户端应该在读取服务中查询状态?在这种情况下,我们只是让整个过程更长。这个问题实际上不仅涉及身份验证方案,还涉及我们发送命令并希望尽快获得执行结果的其他方案。

我只想听听那些实施此类事情的人的意见。想要了解使用CQRS进行身份验证的可能的实际数据/请求流。

1 个答案:

答案 0 :(得分:0)

由于您使用的是CQRS,因此您决定将应用程序的写入与应用程序的读取分开。

  • 要写入应用程序,请使用命令。
  • 要从应用程序中读取,您要么等待事件,要么查询读取模型。

此图显示了不同选项之间的关系:

Architecture of a CQRS application

(该图来自wolkenkit的文档,这是一个用于JavaScript和Node.js的CQRS和事件源框架。)

因此,当您发送LogInUser命令时,命令本身不会返回任何(当然,使用HTTP时必须是一个响应,但它应该只是一个200 OK,这样你就可以验证服务器是否收到了命令,并且迟早会关心它。)

现在服务器处理登录,验证发送的凭据等,并生成适当的UserLoggedIn事件。此事件存储在事件存储中,然后发送到读取模型。

阅读模型对此事件做了两件事:

  • 它只是将它转发给客户。
  • 它会更新您对此事件感兴趣的任何非规范化表格,以便稍后查询。

因此,您的客户有两种选择:

  1. 发送命令后可以等待事件。一旦收到活动,客户就有JWT。
  2. 它可以查询读取模型,直到更新给定记录。
  3. 由于您需要确保只有命令的发送者能够接收JWT,因此选项1实际上是唯一可行的方法。您可以确保仅将事件传递给发送相应命令的客户端,但是您不能拥有包含所有JWT的表,人们只能在进行身份验证之前读取他们的 JWT。有了阅读模型,你就会遇到鸡蛋和鸡蛋问题。

    所以,简而言之:客户应该等待相应的事件,并且事件包含JWT。就是这样。