我正在开发一个新的实验性 Web 应用程序框架,我决定给予 RESTful 一些关注。我已经阅读了基础知识,感觉我对 RESTful 作为一个概念有了很好的理解。

我已经启动并运行了一个系统,严格使用 URL 来定义系统中的“名词”,并从 HTTP 请求方法中获取“动词”。我使用 javascript ajax 调用来提供对 HTML 表单无法提供的 DELETE 和 PUT 方法的访问。(我意识到这些措施并不严格要求是 RESTful,但它满足“统一接口”要求)。

问题在于身份验证的无状态性和可缓存性。网站上用户身份验证的标准模型涉及“登录”身份验证事件,之后(如果成功)用户将处于“墙内”并具有持续的安全会话,并且可以根据后续请求查看和执行未经身份验证的用户可能看不到的操作。这种身份验证的持久性似乎破坏了 RESTful 性。缓存和无状态性似乎被破坏了,因为经过身份验证的用户可能会看到与未经身份验证的用户在同一请求中看到的 HTML 不同的 HTML(例如,侧边栏中可能有一个用于登录的登录表单)出用户)。

使用 www 身份验证策略仅对需要身份验证的请求进行用户身份验证似乎是朝着正确方向迈出的一步,因为它不涉及持久安全会话的概念。然而,仍然存在一个问题,即如何向最终用户描绘“已登录”的外观,以符合我们对网站的期望。

那么,在当前的想法中,以严格的 RESTful 方式处理网页的身份验证和许可,同时仍然允许在 HTML 中进行登录装饰的首选方法是什么?

有帮助吗?

解决方案

  

认证的该持久性   似乎打破的RESTful岬

而不是认证用户,你可能会认为有关创建一个会话。将返回一个新的 “会话ID”,与适当的HTTP状态代码沿(200:OK,403:禁止等)。

  

在用户可能会看到HTML这是   不同于其中   未验证用户将看到   相同的请求

您会问你的REST服务器:“你能给我这个会话ID的HTML(或任何资源)?”。该HTML将根据“会话ID”是不同的。

通过该方法,没有壁用于“持续安全会话”。你只是作用于一个会话。

名词(或资源)将代表实际的会话,如果选择这种方法。

其他提示

“网站上用户身份验证的标准模型涉及“登录”身份验证事件,之后(如果成功)用户将处于“墙内”并具有持久的安全会话”

  1. 这其实并不正确。这在一定程度上是正确的,但仅适用于发明自己的身份验证的网站。

  2. 如果您使用“摘要式身份验证”,浏览器必须随每个请求发送凭据。

摘要式身份验证(每个请求的凭据)完全是 RESTful。

去做。

为了使事情稍微简化一些,您可以根据时间计算摘要身份验证 Nonce,以便它在一段时间内有效(6 分钟、0.1 小时都可以)。每个请求几分钟后都会发送 401 状态并需要重新计算摘要。

保持在媒介与用户特定的元件的页面缓冲能力的一种选择是通过Ajax添加用户特定标记。你服务好每一位使用同一页,包括一些JavaScript,将做一个XHR请求到返回的东西基于用户登录不同的资源。然后,合并到在客户端的页面这一点。那么页面的主要部分将被缓存,因为它是为每个用户相同。

另一种选择是使用ESI(边缘端包含)。有了这些,缓存本身可以合并不同的表示来建立最终的结果。

我想它是这样的:所述的“名词”,在用户认证的会话。所以,你的登录表单使用POST请求到“创造”一个新的会话,并退出使用DELETE请求“删除”会议。

我知道你的意思是关于认证逆着RESTfulness的持久性,但饼干(这给持续性的假象),只是每个请求的一部分。

“鉴别的该持久性似乎打破的RESTful岬。缓存和无国籍似乎被打破,因为认证的用户可能会看到HTML这不同于其中非认证的用户将对于相同的请求见”

这是确定是否该资源的表示是稍微不同的基于认证信息。在auth信息是消息的一部分,因此该消息仍然是“自我描述性的”。从概念上讲,你仍然访问相同的资源,以及编辑和删除链接允许过渡,没有额外的数据块。控制哪些转变是可以根据谁访问资源似乎有效的给我。

回复:丹尼尔的回答是:

如果一个会话是被迅速删除了短暂的对象,这是不是很被缓存,为您塑造只会有可能某一天的使用寿命,同时也继续反正在缓存中使用的空间任何缓存。

那岂不是更好地创建用户为对象,并使用摘要身份验证,(或者如果你一定要一个Cookie)进行身份验证。这样一来,每个用户得到自己的持续性高速缓存而不是持续一天消失缓存的。

这也使得更多的逻辑意义上说,因为你是在做一个页面根据用户看起来不同,(加入“[NAME]你好”和这样的)之间的“登录”和差异“注销“状态取决于用户是否包含在URL中。是否一个特定的人被授予访问该用户特定URL取决于他们是否可以作为用户进行认证。

如果您的RESTful框架,只是要你的web应用中使用,并且不会被用来作为第三方的API,我看不出有任何理由,你为什么不能使用相同的认证方案为您的应用程序的其余部分。你可以把这个认证是不是“应用”水平较低的水平层。在应用程序级别可能仍保持无状态以纯RESTful方式。

当然,如果你打算创建一个RESTful网络API,你需要给这个更多的思考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top