你能帮助我理解这一点吗? “常见的 REST 错误: 会话是不相关的”

免责声明: 我是 REST 思想流派的新手,我正在试图理解它。

所以,我正在读这一页,常见的休息错误,我发现我完全困惑的部分会议是无关紧要的。页面上是这么写的:

应该不需要客户 “登录”或“开始连接” HTTP 身份验证已完成 客户端 应用程序是 资源,而不是服务。因此 没有什么可登录的! 让我们 说你正在订一个航班 REST Web 服务 新的“会话”连接到 你应该问「行程表」 创建者对象”为您创建一个新的 行程表,你可以开始填了 空白的,然后得到一些完全 其他地方的不同组成部分 网页来填补其他空白。 没有会议,所以没有 迁移会话状态的问题 客户之间。也没有 中的“会话关联”问题 服务器(虽然仍然有负载 平衡问题继续)。

好吧,我知道 HTTP 身份验证在每条消息上都是自动完成的,但是怎么做呢?用户名/密码是否与每个请求一起发送?这不是增加了攻击面积吗?我觉得我错过了拼图的一部分。

如果有一个 REST 服务,比如说 /session,它接受一个 GET 请求,在其中传入一个用户名/密码作为请求的一部分,并在身份验证成功时返回一个会话令牌,然后这个令牌可以随后的请求一起传递,这是不是不好呢?从 REST 的角度来看,这有意义吗? 还是说这没有抓住要点?

40513 次浏览

REST 服务要求对每个 HTTP 请求进行身份验证并不罕见。例如,AmazonS3要求每个请求都有一个从用户凭据、要执行的确切请求和当前时间派生的签名。这个签名在客户端很容易计算,可以由服务器快速验证,并且对拦截它的攻击者的用途有限(因为它是基于当前时间的)。

要做到 RESTful,每个 HTTP 请求应该自身携带足够的信息,以便其接收方能够处理它,从而与 HTTP 的无状态特性保持完全一致。

好吧,我得到了 HTTP 认证 每条信息都是自动完成的 但是怎么做呢?

是的,每个请求都会发送用户名和密码。这样做的常用方法是 HTTP基本认证HTTP摘要认证。是的,窃听者可以获取用户的凭证。因此,可以使用 传输层保安(TLS)对所有发送和接收的数据进行加密。

休息一下会不会不好 服务,例如/会话,它接受一个 获取请求,您将在哪里传递 用户名/密码作为 请求,并返回会话标记 如果验证成功, 可以随着 随后的请求? 这是否意味着 从 REST 的观点来看,或者是 没抓住重点?

这不是 宁静,因为它带有状态,但是它相当常见,因为它为用户提供了方便; 用户不必每次都登录。

您在“会话令牌”中描述的内容通常称为 登录 cookie。例如,如果你试图登录你的雅虎帐户,有一个复选框说“让我登录2周”。这实际上是在说(用你的话来说)“如果我成功登录,请让我的会话令牌保持活动2周。”Web 浏览器将发送这样的登录 cookie (可能还有其他的) ,以及您要求它为您制作的每个 HTTP 请求。

我认为你的建议是可以的,如果你想控制客户会话的生命时间。我认为 RESTful 架构鼓励您开发无状态应用程序。正如@2pence 写的 “每个 HTTP 请求本身应该携带足够的信息,以便其接收方能够处理该请求,使其与 HTTP 的无状态特性完全一致”

但是,情况并非总是如此,有时应用程序需要告知客户端何时登录或注销,并根据此信息维护诸如锁或许可证之类的资源。请看我的后续 有个问题的例子这样的情况。

好吧,我得到了 HTTP 认证 每条信息都是自动完成的 但是怎么做呢?

“授权:”客户端发送的 HTTP 头。基本(纯文本)或摘要。

休息一下会不会不好 服务,例如/会话,它接受一个 获取请求,您将在哪里传递 用户名/密码作为 请求,并返回会话标记 如果验证成功, 可以随着 随后的请求? 这是否意味着 从 REST 的观点来看,或者是 没抓住重点?

Session 的整个思想就是使用无状态协议(HTTP)和哑客户端(web 浏览器) ,通过维护服务器端的状态来创建 有声有色应用程序。REST 原则之一是 “使用用于超媒体链接的通用语法,每个资源都是唯一可寻址的”。会话变量是不能通过 URI 访问的。真正的 RESTful 应用程序将在客户端维护状态,通过 HTTP 发送所有必要的变量,最好是在 URI 中。

例如: 使用分页搜索

http://server/search/urlencoded-search-terms/page_num

它与书签 URL 有很多共同之处

不,这没有错。Google 的 客户登录正是以这种方式工作的,值得注意的例外是,客户机被指示使用 HTTP 401响应进入“/session”。但是这并没有创建一个会话,它只是创建了一种方法,让客户端(临时)在没有明确传递凭据的情况下对自己进行身份验证,并让服务器在它认为合适的时候控制这些临时凭据的有效性。

很多人并不十分清楚 REST 原理,使用会话令牌并不意味着你总是有状态的,每个请求发送用户名/密码的原因只是为了认证,发送令牌(由登录过程生成)只是为了决定客户端是否有请求数据的权限,当你使用用户名/密码或会话令牌来决定显示什么数据时,你只是违反了 REST 约定! 相反,您只能使用它们进行身份验证(显示数据或不显示数据)

在您的情况下,我说 YES,这是 RESTy,但是尝试避免在您的 REST API 中使用本机 php 会话,并开始生成您自己的散列标记,这些标记将在确定的时间段内过期!