虽然我“想”我理解它但我需要一些清晰度。使用PURE Restful身份验证,事情确实有点笨拙,使用表单对应用程序的UI有很大帮助(即,获得单独的登录页面,忘记密码链接,更容易注销等等)。
现在表格出现了,有些人说“不安宁” - 对他们来说“不安宁”是什么?是否没有相应的登录资源可以这么说?或者它是否会强迫我失踪的其他东西?
注意:如果有人与他们创建会话,那就完全不同了。我更热衷于知道“为什么”他们被称为宁静?谷歌搜索“基于表单的身份验证与静态身份验证”会引发不少命中。
可以使用这些“表单”进行身份验证并传递令牌,以便应用程序存储在cookie等中,我觉得这完全是宁静的(假设加密安全性等),...
答案 0 :(得分:21)
通过表单发送凭据进行身份验证没有任何问题。问题是大多数基于表单的系统依赖于会话,因此要求您只登录“一次”。
会话是服务器状态,因此违反了REST架构的无状态约束。
如果您每次都必须发送凭据,您可以将它们包含在有效负载中(即使用表单),也可以使用HTTP授权标头。
如果将它们包含在有效负载中,则可以将它们包含在正文中,但仅限于POST或PUT,而不是GET或DELETE(因为它们没有正文)。
如果将它们作为查询参数的一部分包含在URL中,则URL不再必须代表实际资源。其中一个原则是URL匹配资源。在查询参数混乱中添加带外信息(例如凭证),这些信息会稍微限制一些。
因此,对于基于HTTP的REST系统,您最好使用现有的HTTP授权机制,而不是使用其他方法。您也可以使用特定于客户端的SSL证书,这也可以正常工作。
答案 1 :(得分:9)
很好的问题。我认为RESTful纯粹主义者可能会说拥有与操作相关联的URI而不是资源,这使得基于表单的身份验证不是RESTful,这是你指出的自己。
老实说,我认为100%纯RESTful应用程序的概念在Web应用程序方面有点像乌托邦理想。我认为,对于RESTful Web服务来说,这是可以实现的,因为调用应用程序可以使用请求标头传递凭据。
在一天结束时,我认为只要你的应用程序正常工作就可以了,你不应该担心它是否纯粹是REST。
这是我的0.02美元。
答案 2 :(得分:6)
来自this answer:
要成为RESTful,每个HTTP请求应该自己携带足够的信息,以便其接收者处理它以与HTTP的无状态特性完全协调。
基于表单的身份验证不是RESTful - 完全没有会话。 RESTful方式是为每个请求发送凭据。然而,这可能很容易被窃听,但HTTPS / SSL / TLS会关闭这个漏洞。
答案 3 :(得分:1)
基于表单的身份验证不使用HTTP中内置的身份验证技术(例如,基本身份验证,摘要身份验证)。
REST纯粹主义者会要求您尽可能使用HTTP中内置的功能。尽管基于表单的身份验证非常常见,但它并不是官方协议的一部分。因此,REST纯粹主义者将基于表单的身份验证视为“在HTTP 中构建功能的一个实例,当该功能已经存在于在HTTP本身中时。”
答案 4 :(得分:0)
现在出现了表单,有些人说“不平静”——什么是“不平静”?
身份验证凭据不在标准位置。
<块引用>REST 并没有消除对线索的需求。 REST 所做的是将先验知识的需求集中到易于标准化的形式中。 -- Fielding, 2008
RFC 7235 描述了 Authorization 标头;这为我们提供了一种标准方法来区分授权请求(具有标头)和匿名请求(没有标头)。
因为我们可以区分授权请求和匿名请求,所以通用组件可以做一些有趣的事情。
例如,如果源服务器限制对资源的访问,我们可能不希望共享缓存重复使用 HTTP 响应的副本来满足其他请求。因为授权有一个标准化的形式,我们可以定义 caching semantics 来限制共享缓存可以做什么。
将相同的信息放入 cookie 标头中,实际上对通用组件隐藏了授权语义。
(这有点类似于对 safe 请求使用 POST 请求——通用组件无法区分语义安全的 POST 请求和语义不安全的 POST 请求,因此无法智能地利用安全处理)。
如果我们有更智能的表单处理——表单输入控件将信息复制到授权标头而不是查询字符串/请求正文——那么表单将很好。但是 (a) 我们没有,并且 (b) 我们不太可能得到它,因为向后兼容。