15

我目前正在为我的 RESTful API 实现 OAuth 2.0 架构。

对于每个请求,我在 HTTP 标头中设置了一个授权承载令牌,供我的所有客户端发出授权请求。

Authorization: Bearer sdflksd3r4823vkn95-03850432 

我了解在 API 中接受令牌直到过期日期是一种常见的做法。但是假设用户想要撤销令牌,我需要采用一种方法来检查每个请求的令牌状态。

所以我想去数据库检查每个 HTTP 请求。我有一种感觉,由于性能原因,这不会很好地扩展。

所以我想知道像Redis这样的解决方案是否适合非常快速地单次读取访问令牌状态?

4

2 回答 2

19

为令牌提供 HMAC 的目的是让服务器可以快速验证它,而无需调用任何外部数据存储(例如 Redis、MySQL 等)。由于没有共享状态(验证令牌的所有信息都是令牌本身和 HMAC 的密钥),因此这具有很好地扩展到多个服务器的额外好处。

如果您要拥有一个已撤销令牌的黑名单,那么像 Redis 这样的东西可能会很好(尽管仍然比不为每个令牌验证进行远程调用要慢)。正确设置,Redis 实例和 API 服务器之间的延迟较低,您应该会看到每个请求 <10 毫秒。

奖励:进一步加快速度的另一个选择是使用Bloom 过滤器来处理被拒绝的 API 请求的缓存。这样,只有在 Bloom 过滤器将请求令牌标记为可能已撤销时,您才会转到 Redis。请注意,由于这是另一层缓存,因此您必须在拒绝令牌时更新 Bloom 过滤器的状态。

于 2013-04-27T01:28:15.293 回答
2

我正在为自己制作类似的东西。
对于令牌语法和加密,我建议您使用JWT,这是一个很好的标准。
使用 redis 存储一对 token/userid 是可以的,也因为我们可以设置一个过期值。
我还在中间插入了一个布隆过滤器,但我的做法与 sehrope 建议相反:我在登录时通过布隆过滤器存储所有令牌,所以如果令牌不存在,它肯定是无效的;else 可能是正确的,但我必须检查一下 Redis 以确定;但现在我有一个问题:如果我想扩展我的身份验证系统,我需要一个身份验证服务器之间的有状态负载平衡器。恕我直言,使用布隆过滤器创建黑名单是不正确的:如果我在布隆过滤器中将已撤销和错误的令牌列入黑名单,如果该项目未列入黑名单,布隆过滤器将返回 false(我必须在 redis 后端检查它以授权);否则,如果一个元素存在(列入黑名单),我必须在 redis 上检查它以确保,因为布隆过滤器的真实响应可能是误报。

于 2014-05-03T20:55:44.633 回答