当前位置:  开发笔记 > 编程语言 > 正文

你能帮我理解一下吗?"常见的REST错误:会话无关紧要"

如何解决《你能帮我理解一下吗?"常见的REST错误:会话无关紧要"》经验,为你挑选了5个好方法。

免责声明:我是REST学校的新手,我正试图围绕它思考.

所以,我正在阅读这个页面,常见的REST错误,而且我发现我对会话无关紧要的部分感到困惑.这就是页面所说的内容:

客户端不需要"登录"或"启动连接".HTTP验证在每条消息上自动完成.客户端应用程序是资源的消费者,而非服务.因此没有什么可登录的!假设您在REST网络服务上预订航班.您不创建与服务的新"会话"连接.而是要求"行程创建者对象"为您创建一个新的行程.您可以开始填充空白,然后在网络上的其他地方获得一些完全不同的组件以填充其他一些空白.没有会话,因此在客户端之间迁移会话状态没有问题.也没有"会话亲和力"的问题

好的,我得到HTTP身份验证是在每条消息上自动完成的 - 但是如何?是否每次请求都会发送用户名/密码?那不就是增加攻击面积吗?我觉得我错过了这个难题的一部分.

例如,拥有一个/session接受GET请求的REST服务是不是很糟糕,在请求中传入用户名/密码,如果验证成功则返回会话令牌,然后可以随后的请求传递?从REST的角度来看,这是否有意义,还是忽略了这一点?



1> z8000..:

为了平安,每个HTTP请求应进行自身足够的信息供其接收方处理它是完全和谐HTTP的无状态特性.

好的,我得到HTTP身份验证是在每条消息上自动完成的 - 但是如何?

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

难道是坏有一个REST服务,比如说/会话,接受一个GET请求,在那里你会在一个用户名/密码通过作为请求的一部分,并返回一个会话令牌,如果验证成功,这可能然后传递随后的请求?从REST的角度来看,这是否有意义,还是忽略了这一点?

这不是RESTful,因为它带有状态,但它很常见,因为它对用户来说是方便的; 用户不必每次都登录.

您在"会话令牌"中描述的内容通常称为登录cookie.例如,如果您尝试登录Yahoo! 帐户有一个复选框,上面写着"让我登录2周".这基本上是说(用你的话说)"如果我成功登录,请保持我的会话令牌活动2周." Web浏览器将根据您要求它为您提供的每个HTTP请求发送此类登录cookie(可能还有其他cookie).


这个答案对我来说毫无意义.首先,它表示每次都可以传递登录名和密码,因此也是一次,这是有道理的.然后,建议以令牌的形式向客户端返回成功登录状态的想法.如果需要,令牌可以编码创建时间.我们当然可以将信息返回给客户.所以,这个建议似乎对我来说很好.答案说它不好,因为"它带有状态",但是"REST"中的"ST"的概念不是说状态可以在客户端和服务器之间传输吗?

2> Greg Hewgill..:

REST服务要求对每个HTTP请求进行身份验证的情况并不少见.例如,Amazon S3要求每个请求都具有从用户凭据,要执行的确切请求和当前时间派生的签名.此签名很容易在客户端计算,可以由服务器快速验证,并且对截取它的攻击者使用有限(因为它基于当前时间).


你可以详细说明+1:对拦截它的攻击者使用有限(因为它基于当前时间)_?你不是在谈论一个包含加密用户名和密码的cookie吗?喜欢SO呢?(恕我直言)
@RoyiNamir:我不是在谈论一个cookie.S3使用的签名是HTTP请求的参数,但*不是*cookie,它会针对每个请求重新计算.

3> EvilThinker..:

很多人不太清楚REST原理,使用会话令牌并不意味着你总是有状态,每次请求发送用户名/密码的原因仅用于身份验证,发送令牌也是一样(由登录生成)过程)只是为了决定客户端是否有权请求数据,当您使用用户名/密码或会话令牌来决定显示哪些数据时,您只会违反REST会话!相反,你必须只使用它们来进行身份验证(显示数据或不显示数据)

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



4> mogsie..:

不,它不会错过重点.谷歌的ClientLogin以这种方式工作,但明显的例外是客户端被指示使用HTTP 401响应转到"/ session".但这不会创建会话,它只会为客户端创建一种方法(临时)验证自己而不传递明文中的凭据,并且服务器可以根据需要控制这些临时凭证的有效性.


@unforgiven3只要返回的令牌仅用于对用户进行身份验证,而服务器不使用它来将用户与存储在服务器上的其他状态相关联,那么我看不会违反REST约束.
@ unforgiven3,这可能会有所帮助:令牌是一条签名的信息.所以它是独立的.服务器可以验证令牌而不检查先前存储的状态.所以它只是一个存储在客户端上并来回传输的状态.
@ unforgiven3服务器返回的令牌实际上证明用户是他们所说的人.因此,代替每个请求,包括用户名和密码,每个请求都包含令牌,该令牌的构造方式使服务器可以确信其准确性.

5> vartec..:

好的,我得到HTTP身份验证是在每条消息上自动完成的 - 但是如何?

"授权:"客户端发送的HTTP标头.基本(纯文本)或摘要.

难道是坏有一个REST服务,比如说/会话,接受一个GET请求,在那里你会在一个用户名/密码通过作为请求的一部分,并返回一个会话令牌,如果验证成功,这可能然后传递随后的请求?从REST的角度来看,这是否有意义,还是忽略了这一点?

会话的整个想法是通过维护服务器端的状态,使用无状态协议(HTTP)和哑客户端(Web浏览器)创建有状态应用程序.REST原则之一是"每个资源都可以使用通用语法进行唯一寻址,以便在超媒体链接中使用".会话变量是无法通过URI访问的.真正的RESTful应用程序将维护客户端的状态,通过HTTP发送所有必需的变量,最好是在URI中.

示例:使用分页搜索.你的表格中有URL

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

它与可收起的URL有很多共同之处


但是,身份验证信息也无法通过URI访问 - 每个人都在谈论发送身份验证信息作为请求标头的一部分.如何将会话令牌包含在请求中呢?我不是说在URI中使用会话令牌,而是在请求中传递的数据中.
如果您被授权执行该操作,会话令牌也会建立.你是什​​么意思不会影响它的结果?如果呼叫者未获得授权,则会收到"未授权"错误.会话令牌也是如此.我真的没有看到区别?
不,会话令牌是保存在服务器上的**状态**的句柄.那不是RESTful.至于未授权,我不认为这是结果.我宁愿考虑一个例外(如在try/catch中).
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有