【问题标题】:How to force authentication challenging for every request in REST?如何强制对 REST 中的每个请求进行身份验证?
【发布时间】:2013-11-07 16:23:55
【问题描述】:

我的理解是 RESTful 服务应该是完全无状态的。每次调用服务时,我都必须传递它正常运行所需的所有信息。

但是,当涉及到身份验证时,我对它应该如何工作感到相当困惑,尤其是在会话管理方面。

我正在使用基本身份验证,并且第一次发出请求时,客户端会受到挑战(或者我可以从头开始传递标头中的身份验证信息)。但是一旦用户通过了身份验证,只要会话处于活动状态,服务器就不会再挑战这个客户端。

这意味着我需要为当前用户提供一些退出机制(终止他/她的会话)。

看起来这样做的正确方法是以某种方式更改我的配置,以便每个请求都受到身份验证的挑战,但我不知道这如何与会话管理一起使用。

  • 我是否应该在每次请求后手动使会话无效?
  • 或者有没有办法强制客户端在每次发出请求时都受到挑战?

您可以找到很多关于 REST 安全性的问题,甚至可以找到有关如何实现不同身份验证模型的书籍。但是我还没有找到关于如何处理会话管理、登录和注销的好答案。所以要么我做错了什么,要么我误解了这里重要的事情。

对于如何正确处理此问题的任何想法或指导,我将不胜感激。

我将 Jersey 2.4 与 Tomcat 7 一起使用。

【问题讨论】:

    标签: java rest tomcat authentication jersey


    【解决方案1】:

    如果您使用 HTTP Basic 进行身份验证,则客户端第一次受到质询只是因为未从客户端发送 Authorization 标头。一旦它被发送并且服务器发送了 401 以外的其他内容,客户端会缓存这些凭据并在每个请求中重新发送它们。

    您不应该在无状态应用程序中创建会话,不仅因为它们不被使用,而且因为它们需要管理开销(即使是空的)。然而,servlet 架构不能阻止代码创建会话,例如当代码调用httpServletRequest.getSession()httpServletRequest.getSession(true) 时。因此,您需要确保不使用任何执行此操作的代码(或框架)。

    有趣的是,Tomcat 仍然会生成一个 JSESSIONID cookie 供客户端使用,并且在容器的大多数配置下,你不能关闭它。但是,如果没有创建会话,则 cookie 基本上会被忽略(并且每个请求都会生成一个新的 JSESSIONID cookie)。

    而且,由于应用程序是无状态的,因此没有登录或注销的概念。所有身份验证都是根据请求完成的。

    请注意,根据您的特定应用,实用主义可能胜过纯粹的 RESTful。在某些情况下,“一点点”服务器状态确实是为应用程序提供某些类型安全性的唯一方法(例如跨站点请求伪造,任何带有随机数的东西等)

    【讨论】:

      【解决方案2】:

      如果您正在执行 RESTful Web 服务,则不应处理会话。 首次连接 API 时,您需要通过身份验证检查才能获得身份验证密钥。 此密钥是您的 API 将如何识别其用户的方式。

      您不应使会话无效,也不应强制用户重新进行身份验证。

      【讨论】:

      • 您能否详细说明“身份验证密钥”的含义?
      • 身份验证密钥是指对您的网络服务用户来说唯一的密钥。用户第一次使用您的 API 时,他必须通过身份验证检查。通过此检查,您的 Web 服务应生成将发送给用户的唯一密钥。通过这种方式,您可以确保用户不会在每次发出请求时都以明文形式发送他的凭据。
      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2016-02-08
      • 2012-06-13
      • 2015-06-02
      • 2013-11-22
      相关资源
      最近更新 更多