【问题标题】:How do I implement session authentication across microservices?如何跨微服务实现会话身份验证?
【发布时间】:2019-12-06 03:10:57
【问题描述】:

我正在开展一个项目,为此我计划了以下架构:

  1. auth.example.com:提供登录、注册和密码重置功能。

  2. accounts.example.com:允许用户更新其帐户数据。

  3. example.com:提供其他服务。

我想出了以下解决方案来维护跨所有域的身份验证:

  1. 在auth.example.com 上对用户进行身份验证,并设置一个包含JWT 令牌(使用共享密钥的签名令牌)的cookie,其中包含用户数据,其域设置为.example.com。

  2. 用户通过身份验证后,将其重定向到 example.com/dashboard 并验证 cookie 中存在的 JWT 令牌。如果令牌有效,则向用户提供服务,否则重定向到auth.example.com。


现在,我有以下疑惑:

  1. 假设如果用户在accounts.example.com 上更新了他的姓名,我如何让所有其他服务使用更新后的用户数据?

  2. 如果我想禁止用户或删除其帐户或终止所有活动会话,我将如何让其他服务不让该用户通过身份验证?


有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: authentication architecture microservices


    【解决方案1】:

    Club JWT 令牌、oauth 和 openid 等协议,并将会话存储在 redis/memcache 中。 这个 redis/memcache 将成为您所有微服务的单点联系。 假设微服务 m1、m2、... 是独立的,并且使用 restapi 连接到称为 mR 的微服务,该微服务检查 redis/memcache 中的会话。

    【讨论】:

      【解决方案2】:

      JWT 令牌通常是有状态的,这意味着它们具有要验证的所有内容,一旦发布它们就可以使用并且我们无法撤销它们。但是,我们可以使用的方法很少。

      通常我们会缩短令牌的生命周期(到期时间)(例如 15 分钟),并在 X 分钟后使用 Refresh Token 刷新访问权限(了解 Refresh 和 Access Token 之间的区别)。

      假设令牌即将过期,那么我们将重新颁发访问令牌(刷新令牌将在用户再次登录的情况下执行此操作)。刷新令牌是长期存在的令牌,必须小心处理。如果我们必须撤销访问权限,那么我们需要撤销刷新令牌,并且在 X 分钟后用户无法获得访问令牌,因为刷新令牌已经被撤销。

      在您撤销刷新令牌期间,颁发的任何访问令牌在到期之前仍然有效。如果您想在此之前使令牌无效,那么您可能必须将令牌列入黑名单并维护此类令牌的列表,以阻止用户使用该特定令牌登录。

      我在这里找到了很好的解释Check Revoke Token

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 2020-02-05
        • 2020-09-25
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 2019-09-23
        • 1970-01-01
        • 2021-08-13
        相关资源
        最近更新 更多