在RESTful API中使用会话真的违反了RESTful吗?我已经看到了许多意见,但我不相信会议是不安宁的。在我看来:

rest不禁止身份验证(否则在RESTful服务中几乎没有用处) 身份验证是通过在请求中发送一个身份验证令牌来完成的,通常是头 这个身份验证令牌需要以某种方式获得,并且可能会被撤销,在这种情况下需要更新 身份验证令牌需要由服务器验证(否则就不是身份验证)

那么会话是如何违背这一点的呢?

客户端,会话是使用cookie实现的 cookie只是一个额外的HTTP报头 会话cookie可以在任何时候获得和撤销 如果需要,会话cookie可以有无限的生存时间 会话id(身份验证令牌)在服务器端得到验证

As such, to the client, a session cookie is exactly the same as any other HTTP header based authentication mechanism, except that it uses the Cookie header instead of the Authorization or some other proprietary header. If there was no session attached to the cookie value server-side, why would that make a difference? The server side implementation does not need to concern the client as long as the server behaves RESTful. As such, cookies by themselves should not make an API RESTless, and sessions are simply cookies to the client.

我的假设错了吗?是什么使会话cookie不安分?


当前回答

我认为令牌必须包括所有需要的信息编码在它里面,这使得身份验证通过验证令牌和解码信息 https://www.oauth.com/oauth2-servers/access-tokens/self-encoded-access-tokens/

其他回答

据我所知,当我们谈论会话时,有两种类型的状态

客户端和服务器交互状态 资源状态

这里的无状态约束指的是Rest中的第二种类型。使用cookie(或本地存储)并不违反Rest,因为它与第一个相关。

菲尔丁说:“从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。因此会话状态完全保存在客户端上。

这里的问题是,服务器上要完成的每个请求都需要来自客户端的所有必要数据。那么这就被认为是无状态的。再说一遍,我们这里说的不是饼干,我们说的是资源。

我认为令牌必须包括所有需要的信息编码在它里面,这使得身份验证通过验证令牌和解码信息 https://www.oauth.com/oauth2-servers/access-tokens/self-encoded-access-tokens/

Cookies are not for authentication. Why reinvent a wheel? HTTP has well-designed authentication mechanisms. If we use cookies, we fall into using HTTP as a transport protocol only, thus we need to create our own signaling system, for example, to tell users that they supplied wrong authentication (using HTTP 401 would be incorrect as we probably wouldn't supply Www-Authenticate to a client, as HTTP specs require :) ). It should also be noted that Set-Cookie is only a recommendation for client. Its contents may be or may not be saved (for example, if cookies are disabled), while Authorization header is sent automatically on every request.

另一点是,要获得授权cookie,您可能需要首先在某个地方提供您的凭据。如果是这样,那不就是不安分吗?简单的例子:

您尝试没有cookie的GET /a 你得到了一个授权请求 然后授权POST /auth 你会得到Set-Cookie 您尝试GET /a与cookie。但是在这种情况下GET /a的行为是幂等的吗?

总而言之,我认为如果我们访问某些资源并且需要进行身份验证,那么我们必须在同一资源上进行身份验证,而不是在其他任何地方。

不,使用会话并不一定违反restful。如果您坚持REST规则和约束,那么使用会话(维护状态)将是多余的。毕竟,RESTfulness要求服务器不维护状态。

会话不是不安分的 你是说REST服务只用于http还是我弄错了?基于cookie的会话只能用于自己的(!)基于http的服务!(这可能是一个问题与cookie工作,例如从移动/控制台/桌面/等) 如果你为3d开发者提供RESTful服务,永远不要使用基于cookie的会话,而是使用令牌来避免安全问题。