我目前正在为我的RESTful API实施OAuth 2.0架构。
对于每个请求,我在HTTP标头中设置了授权承载令牌,以便我的所有客户发出授权请求。
Authorization: Bearer sdflksd3r4823vkn95-03850432
我理解通常的做法是在API到期之前接受API中的令牌。但是如果用户想要撤销令牌,我需要采用一种方法来检查每个请求的令牌状态。
所以我想去Db检查每个HTTP请求。我觉得由于性能原因,这不会很好地扩展。
所以我想知道像 Redis 这样的解决方案是否适合快速单次读取访问令牌状态?
答案 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过滤器的真实响应可能是误报。