Ruby on rails OAuth使用者是否在每个请求上与OAuth提供者验证承载令牌

Ruby on rails OAuth使用者是否在每个请求上与OAuth提供者验证承载令牌,ruby-on-rails,oauth-2.0,authorization,Ruby On Rails,Oauth 2.0,Authorization,为了进一步了解OAuth,我尝试编写一个OAuth2.0提供程序和一个使用者 我有点把作为我的提供者的参考,但我想写我自己的 我的问题是关于不记名代币规范中的最后一个项目 F资源服务器验证访问令牌,如果有效, 满足要求 在此场景中,资源服务器验证访问令牌是否意味着: 根据访问令牌自身本地存储的副本及其到期日期检查访问令牌 向提供程序服务器发出请求,该服务器返回有效/无效响应? 完全是另一回事吗 规范没有回答这个问题,因为它是一个对协议工作没有影响的实现细节。然而,这是一个可以对安全产生影响的好问

为了进一步了解OAuth,我尝试编写一个OAuth2.0提供程序和一个使用者

我有点把作为我的提供者的参考,但我想写我自己的

我的问题是关于不记名代币规范中的最后一个项目

F资源服务器验证访问令牌,如果有效, 满足要求

在此场景中,资源服务器验证访问令牌是否意味着:

根据访问令牌自身本地存储的副本及其到期日期检查访问令牌 向提供程序服务器发出请求,该服务器返回有效/无效响应? 完全是另一回事吗
规范没有回答这个问题,因为它是一个对协议工作没有影响的实现细节。然而,这是一个可以对安全产生影响的好问题

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

正如OAuth 2.0规范所述:

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

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

如果资源服务器无法读取授权服务器的数据库,那么它必须与授权服务器对话,即使可以,也最好不要直接读取数据库

如何准确地建立和保护该通信取决于您,但是HTTPS REST请求非常有意义。许多实现有不同的机制。有关示例,请参见

显然,当首次向资源服务器提供访问令牌时,资源服务器不知道它,必须访问授权服务器以检查其有效性。现在有趣的问题是:资源服务器是否可以缓存此响应,或者是否必须对每个请求进行调用

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

如果授权服务器响应非常快,则资源服务器可能不需要缓存响应。事实上,设计糟糕的缓存可能比不缓存慢。 设计和实现具有良好缓存策略的缓存对于在资源服务器中实现良好缓存来说可能是禁止的。 根据资源服务器的性质和规模,将磁盘上的RAM或存储分配给缓存的成本对于在资源服务器中实现良好的缓存来说可能是不允许的。当访问令牌的数量非常高,并且需要大量存储才能获得合理的缓存命中率时,尤其如此。 资源服务器是否准备好接受访问令牌,即使它已在授权服务器中被撤销? 最后一点值得进一步解释。授权服务器通常有几种机制来撤销令牌。如果资源所有者通过UI撤销授权,则授权服务器必须使通过该授权访问令牌和刷新令牌获得的所有令牌无效。资源服务器还可以实现令牌撤销端点,该端点通常用于使用隐式授权的公共客户端中的注销机制

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


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

回答得不错。一个小的补充:如果授权服务器发布JWS令牌,那么资源服务器可以检查令牌签名、提取令牌详细信息并验证令牌,而无需咨询授权服务器。@Zólyomisitván True。但是,在这种情况下,您不知道该令牌是否已被撤销,也不知道自您获得该令牌后,这些详细信息是否发生了更改。例如,假设令牌包含用户角色。现在,管理员删除了您的一些角色,即i
dea是指你不再有机会获得某些资源。如果您使用JWS或SAML中的角色,或者。。。令牌,您不知道,用户可以继续使用他们不应该拥有的角色。使用携带数据的令牌非常类似于缓存。从安全的角度来看,不要这样做。没错,这是一种缓存形式,必须考虑安全性,应该只与非常短的生命令牌一起使用。我只是想指出一个缺失的细节,即验证根本不必咨询授权服务器。@Zólyomisitsván这正在变成一场词汇辩论:定义验证。让我们称您的本地验证和我的深度验证为:-