【问题标题】:Does an OAuth Consumer validate a bearer token with the OAuth provider on each requestOAuth 消费者是否在每个请求上使用 OAuth 提供者验证持有者令牌
【发布时间】:2014-11-15 07:41:55
【问题描述】:

要了解有关 OAuth 的更多信息,我正在尝试编写 OAuth 2.0 提供者和消费者。

我有点使用Doorkeeper Gem 作为我的提供者的参考,但我想自己写。

我的问题是关于不记名令牌规范中Section 1.3 中的最后一个项目符号。

(F) 资源服务器验证访问令牌,如果有效, 处理请求。

在这种情况下,The resource server validates the access token 是否意味着:

  • 根据访问令牌的本地存储副本及其到期时间检查访问令牌
  • 向提供者服务器发出请求,返回有效/无效响应?
  • 完全做其他事情

【问题讨论】:

    标签: ruby-on-rails oauth-2.0 authorization


    【解决方案1】:

    规范没有回答这个问题,因为它是一个对协议的工作没有影响的实现细节。不过,这是一个可以影响安全性的好问题。

    首先,你必须意识到,在某些实现中,资源服务器和授权服务器只是一个单一实体的两个角色。

    正如 OAuth 2.0 规范 (RFC 6749) 所说:

    授权服务器和资源服务器的交互 超出了本规范的范围。授权服务器 可以是与资源服务器相同的服务器,也可以是单独的实体。

    它们可能都出现在一个网站中。也许它们是两个不同的网站,但它们都连接到同一个数据库。然后资源服务器可以像授权服务器一样在数据库中查找令牌。

    如果资源服务器无法读取授权服务器的数据库,则它必须与授权服务器通信(即使可以,最好不要直接读取数据库)。

    具体如何建立和保护通信取决于您,但 HTTPS REST 请求很有意义。许多实现具有不同的机制。例如,请参阅OAuth-2.0 resource servers token validation in distributed environment

    显然,当访问令牌第一次被提交给资源服务器时,资源服务器并不知道它,并且必须访问授权服务器以检查其有效性。现在有趣的问题是:资源服务器是否可以缓存这个响应,还是必须对每个请求进行调用?

    这是由资源服务器做出的设计决定,它可能受到许多不同因素的影响。例如:

    • 如果授权服务器响应非常快,则资源服务器可能不需要缓存响应。事实上,设计不当的缓存可能比不缓存要慢。
    • 设计和实现具有良好缓存策略的缓存的需要可能会阻碍在资源服务器中实现良好的缓存。
    • 根据资源服务器的性质和规模,将 RAM 或磁盘上的存储空间分配给缓存的成本可能无法在资源服务器中实现良好的缓存。当访问令牌的数量非常多时尤其如此,并且需要大量存储空间才能获得合理的缓存命中率。
    • 资源服务器是否准备好接受访问令牌,即使它已在授权服务器中被撤销?

    最后一点值得进一步解释。授权服务器通常有几种机制来撤销令牌。如果资源所有者通过 UI 撤销授权,授权服务器必须使通过该授权获得的所有令牌(访问令牌和刷新令牌)无效。资源服务器还可以实现令牌撤销端点(通常用于使用隐式授权的公共客户端中的“注销”机制)。

    资源服务器是否准备好承担接受令牌的风险,即使它已被撤销?如果是这样,持续多长时间?如果是,那么它可以缓存令牌,否则它不能。乍一看,您当然会说资源服务器不应该使用缓存的令牌验证响应。但在某些情况下,可能存在超过风险的性能优势。这显然还取决于资源服务器存储的资源的性质,以及与之相关的真正风险。

    同样,这是我们无法为您做出的设计决定。从安全角度来看,您不应在资源服务器中缓存验证响应。

    【讨论】:

    • 不错的答案。一个小补充:如果授权服务器发布 JWS 令牌,那么资源服务器可以检查令牌签名,提取令牌详细信息并验证令牌,甚至无需咨询授权服务器。
    • @ZólyomiIstván 是的。但是,在这种情况下,您不知道令牌是否已被撤销,也不知道自从您获得令牌以来这些细节是否发生了变化。例如,假设令牌包含用户角色。现在管理员取消了您的一些角色,其想法是您不再有权访问某些资源。如果您使用 JWS(或 SAML 或 ...)令牌中的角色,您不知道并且用户可以继续使用他们不应该拥有的角色。使用数据携带令牌与缓存非常相似。从安全的角度来看,不要这样做。
    • 对,它是一种缓存形式,必须考虑安全性,只能用于非常短暂的令牌。我只是想指出一个缺失的细节,即验证完全不必咨询授权服务器。
    • @ZólyomiIstván 这变成了一场词汇辩论:定义“验证”。我们称你的为“本地验证”,而我的为“深度验证”:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2015-06-04
    • 2015-09-25
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多