以RESTful方式处理许可证和会话

7
在阅读了这篇文章之后,我想到了一个问题:“Common REST Mistakes: Sessions are irrelevant”。如果在RESTful应用程序中确实不鼓励使用会话,那么在这样的应用程序中如何处理许可证问题呢?我具体指的是并发许可证模型而不是命名许可证。也就是说,客户购买X个许可证,这意味着应用程序最多可以允许X个用户同时登录。这意味着应用程序必须保存当前已登录用户的状态。
我知道我可以创建一个资源称为“许可证”,该资源将设置一个cookie或生成唯一的ID,然后客户端必须将其与每个请求一起发送。但这和创建会话没有区别,对吧?
如果我采用无状态方法,并要求客户端为每个请求创建身份验证令牌,那么应用程序将如何知道何时为该客户端消耗和释放许可证?
有没有其他选择?特别是更符合RESTful的选择?
4个回答

4
让我尝试为您连接这些信息,假设我正确地解释了您的问题。 您发布的链接有一个有效的答案,每个请求都应使用HTTP身份验证。如果您需要许可证的概念来维护用户的某种状态,您很可能可以将其与用户链接起来。您有一个(经过验证的)用户名可供使用。您只需要为每个请求调用该控制器并保存其状态。这样您就有了会话。
对于任何关键信息,Cookie输入都不应受信任,但对于额外的验证(如安全令牌),它可能非常有用。我认为在您的站点链接中添加一个随机的安全令牌字段是可行的。当然,它应该在“会话”结束时过期。

1
何时才能调用释放许可证以允许另一个用户登录? 我不希望许可证仅在服务器实际处理请求的毫秒数内被消耗,而是在用户活动期间始终有效。 - LiorH
这就是为什么你应该保存状态。当用户单击注销链接或超时后,会话/许可证应该被销毁。(这可以是数据库表中的一个字段,例如时间戳last_login,对于有效请求将更新为当前时间戳。) - Aram Verstegen
@Aram Verstegen,你说他应该保存状态,但是如果他保存状态,那不违反了REST原则吗? - Rob
嗯,这是一个好问题。我认为保持无状态的概念仅适用于HTTP。除此之外,你可以完全自由地做任何事情。 - Aram Verstegen

1

您可能想要考虑将许可证处理问题下推到基础架构堆栈的下一级。这有点像面向方面编程(AOP)的方法。也许,您可以将其推入Web服务器层,而不是在应用程序层处理它。

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

这种方法促进了基础架构堆栈的关注点分离。它允许每个层次专注于其所需的内容。应用程序层根本不需要担心许可证问题,从而使其严格专注于内容,进而保持URL的清晰和“RESTful”。


1
如果您的许可证是基于并发用户的,那么实现HTTP摘要是微不足道的,并且将使您仅启用最大数量的并发登录。摘要提供了传递过期数据的规定,因此可以超时会话。
身份验证状态由HTTP身份验证保持,而不是其他任何地方,因为它是透明和无处不在的。

0
也许更符合RESTful的许可方式是限制处理请求的速率,而不是并发会话的数量。跟踪过去一小时内的请求次数,如果超过客户已支付的数量,则提供一个503 Service Unavailable响应,并附带一些文本建议用户稍后再试。

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