我的理解是RESTful服务应该是完全无状态的。每次我调用服务时,我都必须传递正常运行所需的所有信息。
但是,在身份验证方面,我对此应该如何工作感到困惑,特别是在会话管理方面。
我正在使用基本身份验证,第一次发出请求时,客户端会受到质疑(或者我可以从头开始传递身份验证信息)。但是,一旦用户通过身份验证,只要会话处于活动状态,服务器就不会再挑战此客户端。
这意味着我需要为当前用户提供一些注销机制(终止他/她的会话)。
看起来这样做的正确方法是以某种方式更改我的配置,以便每个请求都受到身份验证的挑战,但我不知道这对会话管理有何影响。
您可以在REST中找到很多关于安全性的问题,甚至还有关于如何实现不同身份验证模型的书籍。但是我没有找到关于如何处理会话管理,登录和退出的好答案。所以要么我做错了,要么我误解了一些重要的事情。
我很感激有关如何正确处理这些问题的任何想法或指导。
我在Tomcat 7中使用Jersey 2.4。
答案 0 :(得分:1)
如果您使用HTTP Basic进行身份验证,则客户端第一次受到质询,因为未从客户端发送Authorization标头。一旦发送并且服务器发送了除401之外的其他内容,客户端将缓存这些凭据并在每次请求时重新发送它们。
您不应该在无状态应用中创建会话,不仅因为它们未被使用,而且因为它们需要管理开销(甚至是空的)。但是,servlet体系结构无法阻止代码创建会话,例如代码调用httpServletRequest.getSession()
或httpServletRequest.getSession(true)
时。因此,您需要确保不使用任何执行此操作的代码(或框架)。
有趣的是,Tomcat仍然会为客户端生成一个JSESSIONID cookie,并且在容器的大多数配置下,你都无法关闭它。但是,如果未创建会话,则基本上会忽略cookie(并且将在每个请求上生成新的JSESSIONID cookie)。
并且,因为应用程序是无状态的,所以没有登录或注销的概念。所有身份验证都是按请求完成的。
请注意,根据您的特定应用,实用主义可能胜过纯粹的RESTful。有些情况下,服务器状态的“一点点”实际上是为应用程序提供某些类型的安全性的唯一方法(例如跨站请求伪造,任何带有随机数的行为等)。
答案 1 :(得分:0)
如果您正在进行RESTful Web服务,则不应处理会话。 第一次连接到API时,需要通过身份验证检查才能获取身份验证密钥。 这个关键是您的API如何识别其用户。
您不应该使会话无效,也不应强迫用户重新进行身份验证。