6

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

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

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

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

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

由于我真的找不到答案(因此发布了帖子),我在想:也许这样做并不明智,尽管我想不出为什么。如果我可以窃取令牌,我也可以窃取刷新令牌。所以我想我并没有真正看到首先拥有刷新令牌的意义..

编辑

为了回应卢克泰勒的回答,我将澄清我们的用例。

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

因此,我们有一个 REST 服务器,它需要提供对我们受信任的应用程序的完全访问权限,该应用程序执行自己的安全工作,并且同一台服务器需要为我们新的多租户 JavaScript 客户端应用程序的用户提供访问权限。在生产中,我们将有多个 REST 服务器,每个服务器都有自己的数据库,但核心始终相同,因此理论上一台服务器应该能够处理所有问题。

4

1 回答 1

2

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

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

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

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

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

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

于 2013-09-27T12:26:59.147 回答