我有这个非常简洁的基于令牌的身份验证方案,不需要服务器上的会话存储。在每个经过身份验证的呼叫中,在标头中发送加密的JSON有效负载,该标头保存会话信息。服务器可以解密JSON令牌并获取userId
,organizationId
,expiry
等信息。这是超级坏蛋,我喜欢它。
客户今天询问他是否能够分享他的登录凭据,以便其团队中的其他人可以登录。在我目前的系统中,这是可能的。问题是,我们按座位收费,所以我们不想让凭据共享。
我喜欢保持我的无状态认证机制,因为它给女士留下了深刻的印象。我宁愿不必在服务器上安装一些东西来跟踪哪些用户当前已登录,或者其他什么。
但是,我无法想到一种阻止人们共享凭据的无状态方法。有可能吗?
答案 0 :(得分:0)
无国籍......你从来没有真正100%在那里。我想把它添加到你的机制中,但我不推荐它......
让我们看看你的令牌,它是关于你如何生成它的,你当前可能在某个地方存储了一些随机数,所以你已经有了一些状态。相反,您要做的是在登录时根据客户端的可识别信息生成令牌。例如用户代理字符串和IP地址。然后为这些值制作校验和以及存储在服务器上的一些令牌(例如盐渍密码)。
当经过身份验证的请求进入时,您每次都必须重新创建令牌,以检查它是否有效,从而使计算成本高昂。这可能是一个安全风险,让您的客户暴露出盐渍密码吗?
但这样做的重点是什么?每次IP更改时,您都会强制您的客户重新验证。而是使用相同的帐户播放它并检测多个IP和用户代理,然后阻止该帐户一个小时左右。
在服务器上保存整个会话信息要好得多,你不必花费处理能力,存储便宜,会话的memcached不是那么糟糕。并且,你忘了说你没有状态有点谬论......因为你仍然在服务器上存储令牌。