如何跨微服务实现会话身份验证?

时间:2019-07-28 16:03:00

标签: authentication architecture microservices

我正在从事一个我计划了以下体系结构的项目:

  1. auth.example.com:提供登录,注册和密码重置功能。<​​/ p>

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

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

我想出了以下解决方案,用于在所有域中维护身份验证:

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

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


现在,我有以下疑问:

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

  2. 如果我想禁止用户或删除其帐户或终止所有活动的会话,我该如何让该用户不被认证的其他服务?


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

2 个答案:

答案 0 :(得分:1)

JWT令牌通常是有状态的,意味着它们具有要进行身份验证的所有内容,一旦发出,便可以使用它们,而我们无法撤销它们。但是,我们可以使用的方法很少。

通常,我们将令牌的生存期(有效期)保持较短(例如15分钟),并在X分钟后使用刷新令牌刷新访问权限(了解刷新和访问令牌之间的区别)。

说令牌即将过期,那么我们将重新发出访问令牌(刷新令牌将完成该操作,而无需用户再次登录)。刷新令牌是长期存在的令牌,必须谨慎处理。如果必须撤消访问权限,则需要撤消刷新令牌,并且X分钟后,由于刷新令牌已被撤消,用户无法获得访问令牌。

在撤销刷新令牌期间,发出的任何访问令牌在其到期之前一直有效。如果要在此之前使令牌无效,则可能必须将令牌列入黑名单并维护此类令牌的列表,这将阻止用户使用该特定令牌登录。

我在这里Check Revoke Token

找到了很好的解释

答案 1 :(得分:0)

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