可以/应该在spring security中为每个请求刷新OAuth2令牌

Pet*_*ete 5 java spring spring-security oauth-2.0 spring-security-oauth2

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

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

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

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

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

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

编辑

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

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

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

Sha*_*eep 2

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

这实际上没有意义(在 OAuth2 上下文中)。访问令牌由授权服务器颁发,授权服务器决定其有效期。它在资源服务器上“使用”,该资源服务器可能与授权服务器完全分离,因此 OAuth2 中没有工具将使用情况与令牌的生命周期联系起来。理论上来说,将一些东西组合在一起是可能的,但这听起来像是一个坏主意。

如果我可以窃取令牌,我也可以窃取刷新令牌。所以我想我一开始并没有真正看到拥有刷新令牌的意义。

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

从您的问题中并不清楚为什么使用 OAuth2。您可能应该扩展您的问题以澄清这一点。如果只有一个客户端和一个 REST 服务器,为什么不直接使用 HTTPS 上的 BASIC 身份验证之类的东西呢?

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