使用Redis检查每个请求的访问令牌

时间:2013-04-27 01:17:15

标签: api rest redis oauth-2.0 access-token

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

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

Authorization: Bearer sdflksd3r4823vkn95-03850432 

我理解通常的做法是在API到期之前接受API中的令牌。但是如果用户想要撤销令牌,我需要采用一种方法来检查每个请求的令牌状态。

所以我想去Db检查每个HTTP请求。我觉得由于性能原因,这不会很好地扩展。

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

3 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

我实现了类似的处理由JWT生成的撤销令牌的东西。

我正在使用redis来设置已过期的撤销令牌,因此令牌会自动从redis中删除。我有一个中间件来检查redis提供的令牌。检查full post here。希望它有所帮助

答案 2 :(得分:2)

我为自己做了类似的事情 对于令牌语法和加密,我建议你使用JWT,这是一个很好的标准。
使用redis来存储一对令牌/用户ID也是可以的,因为我们可以设置一个到期值 我也在中间插入了一个布隆过滤器,但是我以与sehrope建议相反的方式制作它:我在登录时通过布隆过滤器存储所有标记,所以如果标记不存在则肯定无效;其他可能是正确的,但我必须检查Redis以确定;但现在我遇到了一个问题:如果我想扩展我的auth系统,我需要在auth服务器之间建立一个有状态的负载均衡器。 恕我直言,使用布隆过滤器创建黑名单是不正确的:如果我在布隆过黑名单过滤掉已撤销和错误的令牌,如果项目未列入黑名单,布隆过滤器返回false(我必须在redis后端检查它AUTH);否则如果一个元素存在(列入黑名单)我必须在redis上检查它以确保因为bloom过滤器的真实响应可能是误报。