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

免责声明:我是REST学派的新手,我正试图围绕这个思路。

所以,我正在阅读这个页面,“ 常见REST错误” ,而且我发现我对完全不相关的部分感到十分困惑。 这就是页面所说的:

客户端不需要“login”或“启动连接”。 每个消息都会自动完成HTTP身份validation。 客户应用程序是资源的消费者,而不是服务。 所以没有什么可以login的! 假设您正在预订REST Web服务的航class。 您不会创build一个新的“会话”连接到服务。 而是要求“行程创build者对象”为您创build一个新的行程。 你可以开始填充空白,但在Web上的其他地方获得一些完全不同的组件来填充其他空白。 没有会话,所以在客户端之间没有迁移会话状态的问题。 在服务器中也没有“会话关联性”的问题(尽pipe仍然存在负载平衡问题)。

好吧,我得到的HTTPauthentication是自动完成每封邮件 – 但如何? 是每个请求发送的用户名/密码? 那只是增加攻击面积? 我觉得我缺less部分难题。

有一个REST服务(比如说/session )接受一个GET请求,在这个请求中传入一个用户名/密码,并且在authentication成功的情况下返回一个会话令牌然后传递给随后的请求? 从REST的angular度来看,这是否有意义,还是缺less重点?

为了实现RESTful,每个HTTP请求都应该携带足够的信息,以便接收者处理它,以便与HTTP的无状态特性完全一致。

好吧,我得到的HTTPauthentication是自动完成每封邮件 – 但如何?

是的,用户名和密码随每个请求一起发送。 常用的方法是基本访问authentication摘要访问authentication 。 是的,窃听者可以捕获用户的凭证。 因此可以使用传输层安全性(TLS)来encryption所有发送和接收的数据。

有一个REST服务(比如说/ session)接受一个GET请求,在这个请求中传入一个用户名/密码,并且在authentication成功的情况下返回一个会话令牌然后传递给随后的请求? 从REST的angular度来看,这是否有意义,还是缺less重点?

这不会是RESTful,因为它携带的状态,但是它是相当普遍的,因为它是一个方便用户; 用户不必每次都login。

您在“会话令牌”中描述的内容通常被称为loginCookie 。 例如,如果您尝试login到您的Yahoo! 帐户有一个checkbox,说:“让我login2周”。 这实际上是说(用你的话说)“如果我login成功,保持我的会话令牌活着2周。 网页浏览器会发送这样的logincookie(可能还有其他的)与你要求它为你做的每个HTTP请求。

REST服务对每个HTTP请求都要求validation的情况并不less见。 例如,Amazon S3要求每个请求都有一个从用户凭证,确切的执行请求和当前时间派生的签名。 这个签名在客户端很容易计算,可以被服务器快速validation,并且对拦截它的攻击者有用(因为它是基于当前时间的)。

许多人不清楚REST原理,使用会话标记并不意味着你永远是有状态的,每个请求发送用户名/密码的原因只是用于身份validation,同样用于发送令牌(由login生成进程)只是为了决定客户端是否有权限请求数据,当您使用我们的用户名/密码或会话标记来决定要显示的数据时,您只会违反REST召集! 相反,您必须仅将它们用于身份validation(显示数据或不显示数据)

在你的情况下,我说YES是RESTY,但是尝试避免在你的REST API中使用本机PHP会话,并开始生成自己的散列标记,在确定的时间周期内过期!

不,它不会错过这一点。 Google的ClientLogin正是以这种方式工作的,明显的例外是客户端被指示使用HTTP 401响应去“/ session”。 但是这不会创build一个会话,它只会创build一种方式让客户端(临时)对自身进行身份validation,而不用明文传递凭据,并且服务器根据自己的需要控制这些临时凭证的有效性。

好吧,我得到的HTTPauthentication是自动完成每封邮件 – 但如何?

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

有一个REST服务(比如说/ session)接受一个GET请求,在这个请求中传入一个用户名/密码,并且在authentication成功的情况下返回一个会话令牌然后传递给随后的请求? 从REST的angular度来看,这是否有意义,还是缺less重点?

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

例如:用分页search。 你会在表单中的URL

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

它与可collections的URL有很多相同之处

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

然而,情况并非总是如此,有时应用程序需要告诉客户端何时login或注销,并根据此信息来维护锁或许可证等资源。 看到我的后续问题的例子这样的情况。