可以/应该使用spring security中的每个请求刷新OAuth2令牌

我们使用username-password grant将我们的JS客户端连接到我们的REST服务器。 在某种程度上,oauth / token返回的令牌是我们的会话,因为它允许在有限的时间内访问后端。

每当我们使用令牌向后端发出请求时,我们都想刷新该会话/令牌。

我知道服务器发出了这个刷新令牌,我可以使用它在令牌过期后刷新令牌。

问题是:我不想让客户端负责捕获令牌过期的exception,并在令牌过期之前重新validation或安排刷新。 我希望令牌能够刷新,直到它在有限的时间内不再使用 – 就像会话一样。 (我也不希望它发出每个“数据”请求的刷新请求,虽然我想我记得读过,刷新令牌只有一次…?!)

有没有办法在spring security中做到这一点,还是我必须构建一些自定义的令牌存储实现或我选择的任何部分?

因为我无法找到答案(因此是post)我在想:也许这样做是不明智的,尽管我不明白为什么。 如果我可以窃取令牌,我也可以窃取刷新令牌。 所以我想我真的没有看到首先有一个刷新令牌的重点..

编辑

为了回应Luke Taylor的回答,我将澄清我们的用例。

  • 我们有一个REST服务器,可以保存人员等应用程序数据。 但也提供访问我们的内容管理,并允许客户发布到Facebook。 它封装了应用程序逻辑和数据存储
  • 我们有一个完全成熟的客户端应用程序,它有自己的安全层,只是通过客户端凭证流访问我们的REST服务器上的数据。 谁可以做客户端决定的事情
  • 我们有几个中小型应用程序,比如facebook上的联系人应用程序,它们也使用客户端凭据访问REST服务器上的数据
  • 我们现在正在开发一个客户端应用程序,它只使用javascript访问REST层来完成大客户端应用程序所做的所有工作,但还需要提供一种方法来validation单个用户并允许多租户。 因此,此新客户端应用程序使用用户名密码授予进行身份validation,并使用方法级别安全性来授权用户

因此,我们有一个REST服务器,需要提供对我们的可信应用程序的完全访问权限,该应用程序执行自己的安全性工作,同一服务器需要为我们的新多租户javascript客户端应用程序的用户提供访问权限。 在生产中,我们将有几个REST服务器,每个服务器都有自己的数据库,但核心总是相同的,所以理论上一个服务器应该能够处理所有。

我希望令牌能够刷新,直到它在有限的时间内不再使用 – 就像会话一样

这实际上没有意义(在OAuth2上下文中)。 访问令牌由授权服务器发出,授权服务器决定其有效期。 它在资源服务器上“使用”,资源服务器可能与授权服务器完全分离,因此OAuth2中没有任何工具可以将使用与令牌的生命周期连接起来。 从理论上讲,可能会将某些东西混合在一起,这使得这项工作成为可能,但这听起来不错。

如果我可以窃取令牌,我也可以窃取刷新令牌。 所以我想我真的没有看到首先有一个刷新令牌的重点..

访问令牌被重复使用,并由客户端发送到授权服务器以外的服务器。 刷新令牌由客户端保留,仅发送回授权服务器。 客户端还必须进行身份validation才能成功使用刷新令牌,因此客户端ID和机密也必须受到攻击。

从您的问题中可以清楚地知道为什么使用OAuth2。 您应该扩展您的问题以澄清这一点。 如果只有一个客户端和一个REST服务器,为什么不通过HTTPS使用BASIC auth之类的东西呢?

此外,客户端是基于浏览器的应用程序吗? 如果是这样,用户名/密码授予不适合在不受信任的客户端中使用。