我正在为一些开发实现一组 RESTful 服务,其中一个是身份验证服务。
此身份验证服务对两种身份进行身份验证:
- 应用程序。基于 AppKey 的身份验证,因此客户端必须注册密钥才能访问其余服务。
- 用户。基于众所周知的凭据(用户+密码)的用户身份验证,因此人类和机器可以通过客户端应用程序使用这些 RESTful 服务。
这些 RESTful 服务是无状态的。
当客户端应用程序针对身份验证服务进行身份验证时,或者当人或机器使用凭据作为身份进行身份验证时,这两个操作都会分别生成AppToken和UserToken。
这些令牌是加盐哈希,因此对 RESTful 基础架构的后续请求将在不共享AppKey和凭据的情况下进行身份验证。
从完全无状态方法的角度来看,这些令牌不应该存储在服务层的任何位置,而是以某种客户端状态(fe,Web 客户端将使用HTTP cookie存储它)。这就是我当前的实现现在的工作方式。
因为使用这些令牌重新验证每个请求并让服务层接收来自客户端的令牌,因此它可以比较来自客户端的令牌并检查它是否是在服务层重新生成它的有效令牌并与客户拥有的太贵了,我已经实现了一个服务层AppToken和UserToken,两者都有一个到期日期和一个所有者(为其创建令牌的应用程序或用户),以检查令牌是否来自客户端的存在于令牌存储中。
客户端如何以交互方式取消身份验证? 只是删除客户端安全状态。如果是 Web 客户端,它会丢弃身份验证 cookie 并刷新页面,客户端检测到没有身份验证 cookie 并将用户重定向到登录页面。
从 RESTful 服务的角度来看,这是一种无状态的非身份验证:客户端不知道拥有服务层伪身份验证状态的技巧。它只是一个服务实现细节——一个性能优化——。
我不会列出无状态服务的优点,因为我绝对确定这种方法是可行的,但我发现了一个问题:无状态身份验证/未身份验证意味着客户端不会通知服务器他们关闭会话,所以安全存储以很多无用的记录结束。
如果服务客户端的会话时间有限(fe、1 小时、3 小时、一天...),这不是一个大问题,但是如果用户必须永远进行身份验证(8 个月、一年)会发生什么) ? . 你如何区分什么是过期的令牌?
有一些方法可以解决这种情况:
每当服务层收到请求时,它都会更新令牌到期日期,因此自动化过程可能会丢弃那些已过期的令牌,定义令牌的任意到期时间(fe 24 小时)。
妥协架构的无状态特性,让客户端通知服务层他们不想再被验证,因此服务可以将关联的令牌丢弃到客户端会话(但是等等......如果客户端关闭 Web 客户端会发生什么?用户永远不会主动通知服务必须丢弃令牌......所以......僵尸令牌还在那里,所以自动化过程应该丢弃它们,但是......什么是僵尸令牌?我不喜欢这种方法)。
完全无状态身份验证,无存储,按请求身份验证。
这就是问题!你建议的方法是什么 - 即使不是 1.、2. 或 3. - 为什么?
感谢您的长时间阅读-老实说,我相信该问题的结论对任何人都非常有用-!