【问题标题】:How do I implement session authentication across microservices?如何跨微服务实现会话身份验证?
【发布时间】:2019-12-06 03:10:57
【问题描述】:
我正在开展一个项目,为此我计划了以下架构:
auth.example.com:提供登录、注册和密码重置功能。
accounts.example.com:允许用户更新其帐户数据。
example.com:提供其他服务。
我想出了以下解决方案来维护跨所有域的身份验证:
在auth.example.com 上对用户进行身份验证,并设置一个包含JWT 令牌(使用共享密钥的签名令牌)的cookie,其中包含用户数据,其域设置为.example.com。
用户通过身份验证后,将其重定向到 example.com/dashboard 并验证 cookie 中存在的 JWT 令牌。如果令牌有效,则向用户提供服务,否则重定向到auth.example.com。
现在,我有以下疑惑:
假设如果用户在accounts.example.com 上更新了他的姓名,我如何让所有其他服务使用更新后的用户数据?
如果我想禁止用户或删除其帐户或终止所有活动会话,我将如何让其他服务不让该用户通过身份验证?
有没有更好的方法来解决这个问题?
【问题讨论】:
标签:
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