JWT微服务体系结构中的身份validation

问题如何在微服务应用程序中创build身份validation服务,并让其他服务检查该令牌(JWT)并检索用户?

可能的scheme

我目前的想法是基于身份validation服务在用户身份validation后将{ token, user }插入到Redis中。 所有其他服务都可以在Redis中检查用户的Authorization: Bearer kdI8$dj$nD&...标头令牌。

  • 如果token存在于Redis中,则用户通过身份validation。
  • 如果token在Redis中不存在,则用户不会被authentication。

在这里输入图像说明

  1. 用户将{ username, password }发送至授权服务
  2. Auth服务对凭证进行身份validation并检索{ token, user }
  3. Auth服务将{ token, user }插入到Redis中
  4. 用户使用{ token }Service-1发送请求
  5. Service-1在Redis中为{ token }装饰,并检索{ token, user }
  6. Service-1做它的事情,并发回{ data }

这种方法有没有可能的安全,逻辑或架构问题?

为什么要在Redis中存储令牌还不是很清楚。 安全令牌通常包含有关用户(声明数据)的信息。 如果您需要有关未存储在令牌中的用户信息,则应该能够通过对用户ID声明的简单数据库查询来查看该信息。

每个服务都可以通过检查它的数字签名 (只需要签名证书的公钥),生命期(何时令牌到期),受众(谁是令牌)等来validation传入的令牌。如果主叫方有效的令牌,用户被authentication。

使用这种方法,你将不得不在你的所有服务中validation令牌,如果你没有问题,那么你可能没问题。

访问令牌可能有一个过期时间,这将使得有必要使用刷新令牌从auth服务获取新的访问令牌:

  • 当访问令牌到期时,您将从您正在尝试与之通话的服务X中返回401到客户端。
  • 客户端将不得不调用提供刷新令牌的Auth服务,获取新的访问令牌
    • 最后,客户端将再次使用这个新的访问令牌再次访问服务X,validation它并从服务X获得预期的响应。

在我最近的任务中,我写了一个代理所有请求validation令牌的微服务,代理处理从login / auth到angular色的所有请求,并发送401到过期的令牌和撤销刷新令牌等。我认为这给了我更大的分离而不是在所有服务中处理令牌。 然而,这使得代理成为了一个可能的瓶颈,auth服务的自动调整就是为了解决这个问题。

另外,我没有使用redis,但在accesstoken中存储了散列键(由散列的accesstoken属性+ salt组成),我可以通过重新筛查accesstoken + salt的其他属性来进行validation。

重要的注意事项:在刷新标记scheme上面我的代理只会遇到一个无效/过期accesstoken负载,而在您的情况下,任何服务可以达到与无效标记,我不知道这是否在您的具体情况但它可能是值得一提的…

另一种方法是让Service-A和Service-B调用auth服务来validation令牌,但是由于每个带有令牌的HTTP请求都必须被validation,所以这将推断服务之间的stream量更多。 在这种情况下,一个无效的令牌请求会到达您的服务X,从而推断它的一些负载…