如何处理微服务架构中的身份验证

时间:2018-04-14 21:14:47

标签: microservices grpc

我目前正在阅读很多有关微服务的内容,但我仍然不了解某些部分。我做了以下抽奖:

enter image description here

每个微服务有2个访问:

  • REST:对于http使用
  • gRPC:用于内部/后台通信/交换

如果我想登录,我可以向我的身份验证服务发送Http请求。但是,如果我想访问需要您已连接的Stuff服务呢?

假设用户想要显示数据库STUFF中可用的东西,服务Stuff将首先检查"令牌"连接用户的权利是正确的,通过与身份验证服务进行交换,然后返回内容或者登录需要请求"。

所以我不明白的是,如果需要连接客户端的每个服务都需要与身份验证交换,那么它将创建巨大的互联网流量以检查每个用户请求。所以我虽然关于为每个服务制作一个身份验证服务,但由于我应该只有一个数据库,那么它是否会减慢流量?

另外,如果我理解,每个微服务应该在不同的服务器上,而不是同一个服务器?

我希望我很清楚,不要犹豫,要求提供更多细节!

提前致谢:)

最高

编辑1

基于@ notionquest的答案:

所以它看起来应该更合适吗?

enter image description here

另外,根据彼得的评论,每个服务都可以实现自己的中间件(如上所述的JWT),因此API网关只是一个"传递"。但是,我不觉得这对我来说很好,因为每个服务都会对每个内部交换进行代币检查,不是吗?

对于这些东西来说,它很容易,因为它只检查一次令牌。现在,让我们说,在用户拿到东西后,他选择一个并想购买它。那么"购买服务"将调用stuff服务以验证项目的价格,但是......它必须检查用户令牌,因为这些东西是"在经过身份验证的访问",所以这意味着" ;购买"服务和"东西"服务都检查令牌,这增加了额外的检查。

我虽然关于服务之间的内部保证访问但是值得吗?

另外,也许你说为每个服务实现中间件,因为他们有REST访问权限,但API网关只会破坏访问REST的想法

2 个答案:

答案 0 :(得分:6)

此问题有多种解决方案可供选择。其中一个解决方案是API Gateway pattern

  1. 第一个请求转到API网关
  2. API网关验证&验证请求
  3. 身份验证存储在缓存数据库(如Redis,Memcache等)上,并且有到期时间
  4. 保存的访问令牌将返回给客户端
  5. 客户端可以在后续调用中使用已保存的访问令牌一段时间(即令牌有效)
  6. 令牌过期后,API网关将进行身份验证并将新令牌共享给客户端
  7. 此解决方案将减少对每个请求进行身份验证的需求并提高性能
  8. API Gateway是所有服务的单一入口点。因此,您可能不需要为每个服务单独缓存。

    请参阅此page中的图表。

答案 1 :(得分:2)

除了@notionquest回答之外,还有另一种不涉及API网关的方法;

您可以在所有服务中共享SESSION_SECRET,因此您的身份验证服务的唯一任务是验证数据库的用户名和密码,然后使用SESSION_SECRET加密此信息并返回{{ 3}}。所有其他服务都不需要与身份验证服务进行交互,只需使用SESSION_SECRET检查jwt令牌是否有效(可以解密)。

然后你有另外两个选择;

  1. 将所需的所有用户数据存储在令牌中 - 这将增加从客户端传输到微服务的数据量。根据此信息的大小,这可能会令人望而却步

  2. 您只能存储userId,并根据需要为每个微服务请求其他数据,具体取决于您所描述的数据产生问题的频率/大小。

  3. 请注意,您并不总是能够使用此方法,但根据您的具体情况和要求,考虑到这种架构可能会很有用。

    还要记住,旋转SESSION_SECRET可能很棘手(尽管出于安全原因需要)。 AWS刚刚发布了一项名为jwt token的服务,因此简单的一个想法是让您的微服务定期查询当前有效SESSION_SECRET这样的服务,而不是将此值硬编码或作为环境变量。