REST API:我需要验证注销操作吗?

REST API: Do I need to authenticate log out action?

我正在编写一个 REST API 服务器(使用 Rails),这里有一个关于 会话管理 的问题。

我认为对于 REST API 服务器,我们不需要为每个用户保存登录状态(或 session)。所以我只是为每个用户添加一个 身份验证令牌 。如果他们登录,此服务器将 return 这个令牌给他们,如果注销,则将其销毁。

而且我想知道是否有必要验证此令牌销毁操作?可能有恶意用户迭代所有可能的标记(可能!)并将它们包装在对我的服务器的 DELETE 请求中...

非常感谢!

如果有人知道您的令牌,那么他们可以使用它来验证您的身份。换句话说,通过将令牌发送到 delete 中,您正在对自己进行身份验证。在 DELETE 操作中不需要令牌以外的其他凭据。

有太多可能的标记需要迭代,这不可能是一个合理的攻击。您担心的攻击并非 DELETE 独有。如果用户可以遍历所有令牌,那么他们将能够模拟任何用户执行任何操作。

您可以为 API 使用身份验证令牌。如果您的用户名和密码匹配,概念很简单,您只需创建一个令牌并发送给用户。

您需要为此令牌设置过期时间。

到期时间后或API请求销毁时,您只需删除此令牌。

令牌必须随每个请求一起发送。

在这种方法中,您不需要任何会话。

restful Web 服务的一个方面是无状态,如 Wikipedia 文章中所述。

The client–server communication is further constrained by no client context being stored on the server between requests. Each request from any client contains all the information necessary to service the request, and session state is held in the client.

服务器不应包含有关 session 的任何信息,这意味着身份验证信息必须包含在每个请求中,并且不需要登录或注销方法。

最佳做法是提供一种资源(如某些 OAuth2 实现),即 returns 具有特殊范围和到期时间的令牌。在创建过程中,令牌应存储在后端数据库中。令牌过期后,信息必须从数据库中删除,客户端必须获得令牌的新副本。

更新:

@Ekkehard,这正是我评论的意思。与其使用带有 session id、cookie 和 session 超时的“有状态”http sessions,令牌应该由附加资源提供。

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

如果客户端想要访问后端的特殊服务,它必须向令牌资源发送一个POST请求(后端在数据库中存储具有特殊到期时间的新令牌)。

在 POST 请求中,客户端还可以提供一个额外的查询参数范围,以创建一个令牌,它只允许您访问后端的特殊部分(Google 例如提供许多不同的 API,如 Google 驱动器、Google 邮件等,如果客户端是邮件应用程序,则只需要访问 Google 邮件。这是一项额外的安全功能。)。

响应 returns 令牌和客户端必须在每个对其他资源的请求的 header 中添加此令牌。

Each request from any client contains all the information necessary to service the request, and session state is held in the client.

令牌将根据存储在数据库中的信息从后端进行验证。

令牌资源还可以提供DELETE http 方法,允许用户在过期时间结束前删除现有令牌。过期超时后,令牌会自动从后台数据库中删除。

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

这个 link 您能否提供更多有关在 RESTful 应用程序中使用令牌的方式的提示:

希望对你有帮助, 蒂埃里

简单的答案是:YES, you need to authenticate this token destroy action

这是三件事:

  1. 如果 usernamepassword 匹配用户获得令牌。您需要为此令牌设置过期时间。

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

  3. 如果用户要注销,从客户端销毁令牌,并在服务器端重置令牌。 And also authenticate this token destroy action


注意:令牌过期后销毁。

另一个注意事项: Devise gem 重置 remember_token,当我们从网络注销时 UI。