Authentication 使用RESTful方式进行许可和会话

Authentication 使用RESTful方式进行许可和会话,authentication,rest,licensing,restful-authentication,Authentication,Rest,Licensing,Restful Authentication,读了这篇文章后,我想起了这个问题: 如果在RESTful应用程序中确实不鼓励会话。您将如何处理此类应用程序中的许可证。我特别指的是并发许可证模型,而不是命名许可证。i、 e.客户购买X个许可证,这意味着应用程序最多可以允许X个用户同时登录。这意味着应用程序必须保持当前登录用户的状态 我知道我可以创建一个名为licenses的资源,该资源将设置cookie或生成唯一ID,然后客户端必须在每个请求中发送它。但这和创建会话是一样的,对吗 如果我采用无状态方法,并要求客户端为每个请求创建一个身份验证令

读了这篇文章后,我想起了这个问题:

如果在RESTful应用程序中确实不鼓励会话。您将如何处理此类应用程序中的许可证。我特别指的是并发许可证模型,而不是命名许可证。i、 e.客户购买X个许可证,这意味着应用程序最多可以允许X个用户同时登录。这意味着应用程序必须保持当前登录用户的状态

我知道我可以创建一个名为licenses的资源,该资源将设置cookie或生成唯一ID,然后客户端必须在每个请求中发送它。但这和创建会话是一样的,对吗

如果我采用无状态方法,并要求客户端为每个请求创建一个身份验证令牌,那么应用程序如何知道何时使用和发布该客户端的许可证


还有别的选择吗?特别是一个更安静的选择?

假设我正确地解释了你的问题,让我试着为你连接点。 您发布的链接有一个有效的答案,每个请求都应该使用HTTP身份验证。如果您需要许可的概念来维护用户的特定状态,您很可能会将其链接到用户。您有一个(已验证的)用户名可供使用。您只需要为每个请求调用该控制器并保存其状态。这就是你的课程


对于任何关键信息,Cookie输入都不应被信任,但对于额外的验证(如安全令牌)非常有用。我认为将随机安全令牌字段添加到您的站点链接将是一种restful方法。当然,它应该用“会话”过期。

您可能想考虑将基础设施堆栈中的许可证处理问题推到一级。有点像面向方面编程(AOP)方法。或许,您可以将其推入web服务器层,而不是在应用层处理它

如果不了解基础架构的详细信息,就很难给出具体的建议。以*nix平台为例,许可证处理逻辑可以作为Apache HTTP服务器的一个模块来实现


这种方法促进了整个基础架构堆栈中关注点的分离。它允许每一层关注它的目的。应用层根本不需要担心许可问题,允许它严格关注内容,从而保持URL的干净和“RESTful”

如果您的许可是基于并发用户的,那么实现HTTP摘要是很简单的,并且只允许您启用最大数量的并发登录。摘要提供了传递过期数据的功能,因此您的会话可以超时


身份验证状态由http authetnication而不是其他任何地方持有,因为它是透明和普遍的。

也许一种更为RESTful的许可方式是限制处理请求的速率,而不是限制并发会话的数量。跟踪过去一小时内的请求数量,如果请求数量超过客户已支付的数量,则提供
503服务不可用
响应,以及一些提示用户稍后重试的文本。

何时调用发布许可证?允许其他用户登录。我不希望仅在服务器中实际处理请求的毫秒内使用许可证,而是在用户处于活动状态的整个时间内使用许可证。这就是为什么您应该保存状态。当用户单击注销链接或超时后,会话/许可证应被销毁。(可以是数据库表中的一个字段,比如时间戳last_login,它将更新为有效请求的当前时间戳。)@Aram Verstegen,你说这就是他应该保存状态的原因,但如果他保存状态,这不违反REST原则吗?嗯,这是个好问题。我认为保持无状态的概念只适用于HTTP。除此之外,你做什么都完全取决于你自己。