另一分钟,我读了一篇关于 OAuth 的文章。它特别描述了在一系列请求期间客户端和服务提供者之间交换的令牌。
文章还提到,OAuth 作为授权层在 RESTful API 中获得了极大的普及。据我了解,REST 应该保持完全无状态。
问题是:这种重复的代币交换,是不是破坏了 REST 的“无状态”原则?恕我直言,令牌可以看作是一种会话 ID,不是吗?
OAuth 令牌明确是会话标识符,OAuth 令牌协商协议中的请求之间的交互不是无状态的,因为请求必须以特定顺序执行,并且它们确实需要服务器上的每个客户端存储,因为您需要跟踪诸如何时他们被签发了。所以是的,OAuth 确实违反了 RESTful 架构的严格原则。
不幸的是,Real World TM可以应对我们需要做的事情,例如允许应用程序代表个人进行身份验证而不要求他们的密码,而 OAuth 做得相当好。如果没有这种状态,就不可能实现类似的安全认证方案。实际上,OAuth (1.0a) 要求的更改之一是向令牌协商协议添加更多状态以降低安全风险。
那么,它是否破坏了 REST 的无状态原则?是的。这有关系吗?除非你住在象牙塔里 :-)
身份验证是在处理 Web 交互时必须以某种方式跟踪的状态。最终,如果您的应用程序是否安静,服务器必须能够跟踪每个用户的“身份验证状态”,不幸的是,这需要某种规避 HTTP 的底层无状态性质以及任何其他传输/技术(如 REST)之上它。
因此,要开发任何类型的经过身份验证的应用程序,必须在某处插入状态原则,如果这恰好是 REST 之上的 OAuth,那就必须如此!