我正在开发一个新的实验性Web应用程序框架,我决定给RESTful一些关注。我已经阅读了基础知识,并且觉得我对RESTful作为一个概念非常了解。
我已启动并运行系统,严格使用URL来定义系统中的“名词”,并从HTTP请求方法中获取“动词”。我正在使用javascript ajax调用来提供对HTML表单无法提供的DELETE和PUT方法的访问。 (我意识到这些措施并非严格要求是RESTful,但它满足'统一接口'的要求)。
问题在于无状态和可缓存性与身份验证。用于网站上的用户认证的标准模型涉及“登录”认证事件,之后(如果成功)用户具有持久安全会话的“在墙内”,并且可以在未经认证的用户可能没有的后续请求上查看和执行操作。这种身份验证的持久性似乎打破了RESTful-ness。缓存和无状态似乎被破坏,因为经过身份验证的用户可能会看到与未经身份验证的用户将针对同一请求看到的HTML不同的HTML(例如,在边栏中可能有一个登录表单用于记录 - 用户)。
使用www-authenticate策略仅对需要身份验证的请求对用户进行身份验证似乎是朝着正确方向迈出的一步,因为它不涉及持久安全会话的概念。然而,仍然存在如何向最终用户描绘“登录”外观的问题,以保持我们对网站的期望。
那么在目前的想法中,以严格的REST方式处理网页的身份验证和权限的首选方法是什么,同时仍允许HTML中的登录装饰?
答案 0 :(得分:4)
“网站上用户身份验证的标准模型涉及”登录“身份验证事件,之后(如果成功)用户”在墙内“并具有持久安全会话”
这不是很正确。这部分是正确的,但仅适用于发明自己身份验证的网站。
如果您使用“摘要身份验证”,则浏览器必须在每次请求时发送凭据。
摘要式身份验证 - 每个请求的凭据 - 完全是RESTful。
那样做。
为了使事情稍微简化,您可以根据时间计算摘要身份验证Nonce,以便在一段时间内有效(6分钟,0.1小时是好的)。每隔几分钟,请求将发送401状态并要求重新计算摘要。
答案 1 :(得分:3)
这种持久性的身份验证 似乎打破了RESTful-ness
您可以考虑创建会话,而不是对用户进行身份验证。您将返回一个新的“会话ID”,以及相应的HTTP状态代码(200:OK,403:Forbidden等)。
用户可能会看到HTML 不同于那个 未经身份验证的用户将查看 同样的要求
您将询问您的REST服务器:“您可以获取此会话ID的HTML(或任何资源)吗?”。 HTML将根据“会话ID”而有所不同。
使用此方法,“持久安全会话”没有隔离墙。你只是在一个会话上行事。
如果您选择使用此方法,名词(或资源)将代表实际会话。
答案 2 :(得分:2)
为具有用户特定元素的页面保留中介的可缓存性的一个选项是通过Ajax添加用户特定的标记。您为每个使用相同的页面提供服务,包括一些JavaScript将对根据用户登录返回不同内容的资源执行XHR请求。然后将其合并到客户端的页面中。然后,页面的主要部分将是可缓存的,因为它对每个用户都是相同的。
另一种选择是使用ESI(Edge Side Includes)。有了这些,缓存本身可以合并不同的表示来构建最终结果。
答案 3 :(得分:1)
我这样想:用户身份验证中的“名词”是一个会话。因此,您的登录表单使用POST请求来“创建”新会话,并且注销使用DELETE请求来“删除”会话。
我知道你对RESTfulness的持久性认证意味着什么,但是cookie(给出了持久性的假象)只是每个请求的一部分。
答案 4 :(得分:1)
“这种身份验证的持久性似乎打破了RESTful-ness。缓存和无状态似乎被打破了,因为经过身份验证的用户可能会看到HTML与未经身份验证的用户将针对同一请求看到的HTML不同”< / p>
如果资源的表示根据身份验证信息略有不同,则可以。身份验证信息是消息的一部分,因此消息仍然是“自我描述性的”。从概念上讲,您仍在访问相同的资源,编辑和删除链接是允许的转换,而不是其他数据。根据谁访问资源来控制可用的转换似乎对我有用。
答案 5 :(得分:1)
回复:丹尼尔回答:
如果会话是一个快速删除的临时对象,那么这不是很容易安装,因为您创建的任何缓存只有一天的有用生命周期,但仍然会继续占用缓存中的空间。
将USER创建为对象并使用摘要式身份验证进行身份验证(如果必须,则为cookie)不是更好。这样,每个用户都可以获得自己的持久缓存,而不是持续一天的缓存并消失。
这对我来说更具逻辑意义,因为你根据USER,(添加'hello [name]'等)和“登录”和“注销”之间的区别使页面看起来不同“状态取决于用户是否包含在URL中。是否授予特定人员访问该用户特定URL的权限取决于他们是否可以作为该用户进行身份验证。
答案 6 :(得分:0)
如果您的RESTful框架仅供您的Web应用程序使用,并且不会被用作第三方的API,我认为您没有理由不能使用与其他应用程序相同的身份验证方案。您可以将此身份验证视为比“应用程序”级别更低级别的层。应用程序级别仍然可以以纯RESTful方式保持无状态。
当然,如果您计划创建RESTful Web API,则需要更多考虑。