Ruby on rails RESTAPI:我需要验证注销操作吗?

Ruby on rails RESTAPI:我需要验证注销操作吗?,ruby-on-rails,rest,api-design,Ruby On Rails,Rest,Api Design,我正在编写一个RESTAPI服务器(使用Rails),这里有一个关于会话管理的问题 我认为对于RESTAPI服务器,我们不需要为每个用户保存登录状态(或会话)。因此,我只需为每个用户添加一个身份验证令牌。如果他们登录,此服务器将向他们返回此令牌,如果他们注销,则将其销毁 我想知道是否有必要验证这个令牌销毁操作?可能有恶意用户迭代所有可能的令牌(可能!),并将它们包装在对我的服务器的删除请求中 非常感谢 如果有人知道您的令牌,那么他们可以使用它作为您的身份验证。换句话说,通过将令牌发送到delet

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

我认为对于RESTAPI服务器,我们不需要为每个用户保存登录状态(或会话)。因此,我只需为每个用户添加一个身份验证令牌。如果他们登录,此服务器将向他们返回此令牌,如果他们注销,则将其销毁

我想知道是否有必要验证这个令牌销毁操作?可能有恶意用户迭代所有可能的令牌(可能!),并将它们包装在对我的服务器的删除请求中


非常感谢

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


有太多可能的令牌需要迭代,这可能是一个合理的攻击。您担心的攻击不是唯一可以删除的。如果用户可以迭代所有令牌,那么他们就可以模拟任何用户执行任何操作。

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

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

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

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


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

restful web服务的一个方面是无状态,如本文所述

客户端与服务器之间的通信还受到请求之间服务器上没有存储客户端上下文的限制。来自任何客户端的每个请求都包含为请求提供服务所需的所有信息,并且会话状态保存在客户端中

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

最佳实践是提供一个资源(像一些OAuth2实现),它返回一个具有特殊作用域和过期时间的令牌。在创建过程中,令牌应该存储在后端的数据库中。令牌过期后,必须从数据库中删除信息,客户端必须获得令牌的新副本

更新:

@Ekkehard,这正是我评论的意思。不应使用带有会话id、cookies和会话超时的“有状态”http会话,而应由其他资源提供令牌

[…]请求之间服务器上未存储任何客户端上下文

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

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

响应返回令牌,客户机必须在每个请求的头中将该令牌添加到其他资源

来自任何客户端的每个请求都包含为请求提供服务所需的所有信息,并且会话状态保存在客户端中

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


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

RESTful应用程序必须是无状态的,并且需要在每个请求内发送安全令牌est使用头
授权
。使用凭据或使用OAuth2身份验证流从授权服务器获取此类安全令牌(有关更多详细信息,请参阅此链接)。此类令牌具有过期日期或可从此服务器失效

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

  • 为RESTful应用程序使用令牌实现身份验证
希望它能帮助你,
Thierry

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

这里有三件事:
  • 如果
    用户名
    密码
    匹配,则用户将获得令牌。您需要为此令牌设置过期时间

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

  • 如果用户要注销,请从客户端销毁令牌,并在服务器端重置令牌。
    并验证此令牌销毁操作


  • 注意:过期后销毁令牌


    另一个注意事项:
    设计gem
    在我们从web UI注销时重置
    记住_令牌

    不完全正确。您引用的意思是服务器的web服务部分不应存储任何状态。这是完全正确的,在某些情况下绝对有必要在较大的“服务器”上存储会话信息基础设施(即,在数据库中)。只是不直接在web服务器中;特别是不在持久请求之间的web服务器内存中。您好@Ekkehard,非常感谢您的评论。我只是想知道这些情况是什么?您能否给我一个提示,我们应该在什么时候存储会话信息?实际上是针对服务器移动架构