当使用CQRS模式构建系统时,我对Web应用程序中的身份验证/登录的实际场景感兴趣。
假设我们将HTTP服务用于命令/查询。使用JWT(或任何其他身份验证令牌)进行身份验证
LogInUser
。然后呢?作为命令的结果我们应该返回什么?只有authToken
的结果好吗?然后客户端应该在读取服务中查询状态?在这种情况下,我们只是让整个过程更长。这个问题实际上不仅涉及身份验证方案,还涉及我们发送命令并希望尽快获得执行结果的其他方案。
我只想听听那些实施此类事情的人的意见。想要了解使用CQRS进行身份验证的可能的实际数据/请求流。
答案 0 :(得分:0)
由于您使用的是CQRS,因此您决定将应用程序的写入与应用程序的读取分开。
此图显示了不同选项之间的关系:
(该图来自wolkenkit的文档,这是一个用于JavaScript和Node.js的CQRS和事件源框架。)
因此,当您发送LogInUser
命令时,命令本身不会返回任何(当然,使用HTTP时必须是一个响应,但它应该只是一个200 OK
,这样你就可以验证服务器是否收到了命令,并且迟早会关心它。)
现在服务器处理登录,验证发送的凭据等,并生成适当的UserLoggedIn
事件。此事件存储在事件存储中,然后发送到读取模型。
阅读模型对此事件做了两件事:
因此,您的客户有两种选择:
由于您需要确保只有命令的发送者能够接收JWT,因此选项1实际上是唯一可行的方法。您可以确保仅将事件传递给发送相应命令的客户端,但是您不能拥有包含所有JWT的表,人们只能在进行身份验证之前读取他们的 JWT。有了阅读模型,你就会遇到鸡蛋和鸡蛋问题。
所以,简而言之:客户应该等待相应的事件,并且事件包含JWT。就是这样。