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

WHI*_*LOR 6 authentication cqrs event-sourcing

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

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

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

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

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

Gol*_*den 5

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

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

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

CQRS 应用程序的架构

(该图取自wolkenkit的文档,是 JavaScript 和 Node.js 的 CQRS 和事件源框架。)

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

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

读取模型对这个事件做了两件事:

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

所以你的客户有两个选择:

  1. 它可以在发送命令后等待事件。一旦接收到事件,客户端就拥有 JWT。
  2. 它可以查询读取模型,直到给定的记录被更新。

由于您需要确保只有命令的发送方能够接收 JWT,因此选项 1 实际上是唯一可行的方法。您可以确保事件仅传递给发送相应命令的客户端,但您不能拥有一个包含所有 JWT 的表,其中人们只能在通过身份验证之前读取他们的JWT。使用读取模型,您在这里遇到了先有鸡还是先有蛋的问题。

因此,长话短说:客户端应该等待适当的事件,并且该事件包含 JWT。就是这样。