REST API:我需要为注销操作进行身份验证吗?

4
我正在编写一个使用Rails的REST API服务器,关于会话管理有一个问题。
我认为对于REST API服务器,我们不需要为每个用户保存登录状态(或会话)。因此,我只为每个用户添加了身份验证令牌。如果他们登录,这个服务器将返回这个令牌给他们,如果注销,就销毁它。
我想知道是否有必要对销毁这个令牌的操作进行身份验证?可能会有恶意用户迭代所有可能的令牌(也许!)并将它们包装在一个DELETE请求中发送到我的服务器...
非常感谢!
5个回答

4
restful web服务的一个方面是无状态,正如 维基百科文章所述。客户端和服务器之间的通信受到进一步约束,即不存储任何客户端上下文在请求之间的服务器上。每个来自任何客户端的请求都包含服务请求所需的所有信息,并且会话状态保存在客户端中。服务器不应该包含有关会话的任何信息,这意味着身份验证信息必须包含在每个请求中,并且不需要登录或注销方法。最佳做法是提供一个资源(例如某些OAuth2实现),它返回具有特殊范围和过期时间的令牌。在创建过程中,令牌应存储在后端的数据库中。令牌过期后,必须从数据库中删除信息,并且客户端必须获取令牌的新副本。
更新:@Ekkehard,这正是我在评论中想说的。与使用具有会话ID,cookie和会话超时的“有状态”http会话不同,令牌应由附加资源提供。

[...] no client context being stored on the server between requests.

如果客户想要访问后端的特殊服务,它必须向令牌资源发送一个POST请求(在此处,后端将新令牌与特定的过期时间存储在数据库中)。
在POST请求中,客户端还可以提供一个附加的查询参数范围,以创建一个仅允许访问后端特定部分的令牌(例如,Google提供许多不同的API,如Google Drive、Google Mail等,如果客户端是邮件应用程序,则仅需要访问Google Mail。这是一个额外的安全功能)。
响应返回令牌,客户端必须在每个请求其他资源的标题中添加此令牌。
任何客户端的每个请求都包含服务请求所需的所有信息,并且会话状态保存在客户端中。
基于存储在数据库中的信息,后端将验证令牌。
令牌资源也可以提供DELETE http方法,以允许用户在过期时间结束之前删除现有令牌。在过期超时之后,令牌将自动从后端的数据库中删除。

不完全正确。你所引用的意思是服务器的Web服务部分不应存储任何状态。在更大的“服务器”基础设施(即DB中)上存储会话信息是完全可以的,有时甚至是必要的。只是不能直接存储在Web服务器上,特别是不能存储在持久化的请求之间的Web服务器内存中。 - AnoE
嗨@Ekkehard,非常感谢您的评论。我在想那些“某些情况”是什么?您能否给我一些提示,告诉我何时应该存储会话信息?实际上,对于服务器-移动架构,不存储会话是合理的,只需将令牌发送到客户端即可。但是对于服务器-浏览器呢? - Vincent Zhao
@VincentZhao,在第二次阅读我的评论时,我似乎有点冒犯你了 - 对此我感到抱歉,这不是我的本意。我遇到过两个特定的原因来跟踪服务器上的会话:有时应用程序的所有者只想知道每个用户登录的时间,登录了多长时间以及在哪些情况下登录(在这些应用程序中,用户可以通过不同的方式登录,每个会话获取不同的权限)。另一个原因是应用程序所有者能够通过在他的数据库中使它们失效来强制终止会话。 - AnoE
在第一种情况下,这当然也可以简单地称为“审计”; 在第二种情况下,它使Web服务器在每个用户请求上执行DB往返。 当然,这不适用于非常大的应用程序。 尽管如此,这意味着DB服务中的会话信息(而不是Web服务器本身 - 我确实认为这是一个大忌)。 - AnoE

1
如果有人知道你的令牌,他们就可以使用它来作为你进行身份验证。换句话说,通过将令牌发送到删除操作中,您正在进行身份验证。在DELETE操作中不需要除令牌之外的任何其他凭据。
对于这种情况来说,可能的令牌太多了,无法枚举,因此不太可能发生攻击。你所担心的攻击并不是DELETE独有的。如果一个用户能够枚举所有令牌,那么他们就能够冒充任何用户执行任何操作。

1
你可以使用身份验证令牌进行API。概念很简单,如果您的用户名和密码匹配,则只需创建一个令牌并发送给用户。
您需要为此令牌设置过期时间。
在过期时间或API请求销毁时,您只需删除此令牌。
每个请求都必须发送令牌。
在这种方法中,您不需要任何会话。

非常感谢您的回答,真的很清楚 :). 不过,如果客户端是浏览器,您认为不在服务器端存储登录信息是否合理?我该如何知道现在有多少人在线?再次感谢! - Vincent Zhao
登录信息需要保存在数据库中以检查有效用户。如果仅具备登录认证,则有令牌的任何人都可以登录。 - Md Sirajus Salayhin

1

RESTful应用程序必须是无状态的,并且安全令牌需要使用头部Authorization在每个请求中发送。这些安全令牌是使用凭据或使用OAuth2身份验证流程(有关详细信息,请参见此链接http://www.bubblecode.net/en/2013/03/10/understanding-oauth2/)从授权服务器获取的。这些令牌具有过期日期或可以从此服务器使其失效。

此链接还可以为您提供有关在RESTful应用程序中使用令牌的方法的更多提示:

希望它能帮助您, Thierry


0

简单的答案是:是的,您需要对此令牌销毁操作进行身份验证

以下是三件事:

  1. 如果用户名密码匹配用户,则会获得一个令牌。您需要为此令牌设置过期时间。

  2. 用户必须在每个请求中发送令牌。因此,服务器端不需要会话。

  3. 如果用户想要注销,则从客户端销毁令牌,并在服务器端重置令牌。还需要对此令牌销毁操作进行身份验证


注意: 在过期时间后销毁令牌。

另一个说明: 当我们从Web UI注销时,Devise gem会重置remember_token


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接