我正在从事一个我计划了以下体系结构的项目:
auth.example.com:提供登录,注册和密码重置功能。</ p>
accounts.example.com:允许用户更新其帐户数据。
example.com:提供其他服务。
我想出了以下解决方案,用于在所有域中维护身份验证:
在auth.example.com
上对用户进行身份验证,并设置一个包含JWT令牌(带有共享密钥的签名令牌)的cookie,该cookie包含用户数据,并且其域设置为.example.com
。
用户通过身份验证后,将其重定向到example.com/dashboard
并验证cookie中存在的JWT令牌。如果令牌有效,则向用户提供服务,否则重定向到auth.example.com
。
现在,我有以下疑问:
假设用户在accounts.example.com
上更新了他的姓名,我如何使所有其他服务使用更新后的用户数据?
如果我想禁止用户或删除其帐户或终止所有活动的会话,我该如何让该用户不被认证的其他服务?
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
JWT令牌通常是有状态的,意味着它们具有要进行身份验证的所有内容,一旦发出,便可以使用它们,而我们无法撤销它们。但是,我们可以使用的方法很少。
通常,我们将令牌的生存期(有效期)保持较短(例如15分钟),并在X分钟后使用刷新令牌刷新访问权限(了解刷新和访问令牌之间的区别)。
说令牌即将过期,那么我们将重新发出访问令牌(刷新令牌将完成该操作,而无需用户再次登录)。刷新令牌是长期存在的令牌,必须谨慎处理。如果必须撤消访问权限,则需要撤消刷新令牌,并且X分钟后,由于刷新令牌已被撤消,用户无法获得访问令牌。
在撤销刷新令牌期间,发出的任何访问令牌在其到期之前一直有效。如果要在此之前使令牌无效,则可能必须将令牌列入黑名单并维护此类令牌的列表,这将阻止用户使用该特定令牌登录。
找到了很好的解释答案 1 :(得分:0)
俱乐部JWT令牌,oauth和openid等协议,并将会话存储在redis / memcache中。 此redis / memcache将是您所有微服务的单点联系。 假设微服务m1,m2,...是独立的,并使用restapi连接到名为mR的微服务,该服务检查redis / memcache中的会话。