微服务架构中用户服务和身份验证服务之间的通信

时间:2018-08-20 06:07:06

标签: spring security spring-security microservices restful-authentication

场景:

这是我的微服务应用程序的登录方案:

  1. 用户输入他的电话号码
  2. 将发送验证码
  3. 用户必须发送收到的代码以对其进行验证
  4. 用户必须输入密码
  5. 将收到JWT令牌

REST实施

为实现给定方案,我创建了三个服务:auth,sms和user。从我的角度来看,我认为最好处理用户发送验证码和生成JWT令牌的请求。这是我的实现细节:

  • 用户致电POST /user/sms,将其电话号码发送给用户服务。在其中,将向 sms-service 发送请求以发送验证码。

  • 然后用户调用POST /user/verify验证代码,该请求将再次在 user-service 内部处理。如果代码有效,则用户服务将生成一个临时令牌,并将其传递给标头响应(假设用户已经注册到系统中)

  • 现在,用户通过POST /user/password传递带有临时令牌的密码。如果凭据有效,则用户服务将调用 auth-service 以获取JWT令牌并将其附加到POST /user/password的响应标头中。

问题

用户<-> auth和用户<-> sms服务之间是否存在正确的通信?

1 个答案:

答案 0 :(得分:2)

我认为您在服务之间划分界限的方式无论如何都不是问题。 我在这里可以看到一些利弊

具有单独的SMS服务,即使在其他情况下(例如向用户发送其他类型的通知),它也使您可以使用它,如果您要更改SMS提供程序,则很容易,但是该服务应该全部独立使用(使用一个用于通信的消息代理。

用户服务是完全可以的,但是您应该知道,对另一个服务的每个新HTTP调用都会创建“等待时间”(您应将其考虑在内),例如在这种情况下,为了释放a令牌。

当您有一个服务在调用另一个服务而不是引入耦合时。在我看来,如果您不使用任何第三方工具来处理令牌,但我认为您应该在同一微服务中同时包含令牌处理和用户,那么我认为通过这种方式您将拥有更好的绑定上下文,由于这些数据将位于同一数据库中,因此更易于运行联接。

如果您使用第三方工具来处理令牌,那么最好将其用于不同的服务中,因为这样您将创建抽象并且将来很容易更换工具。

平视

确保每个微服务都有其自己的数据库,并且您不能直接访问该服务所属的上下文之外的任何其他数据库。