2013-04-27 62 views
11

我目前正在为我的RESTful API实现OAuth 2.0体系结构。使用Redis检查访问令牌的每个请求

对于每个请求,我都在HTTP标头中为所有客户端设置授权承载令牌,以制作授权请求。

Authorization: Bearer sdflksd3r4823vkn95-03850432 

据我所知,通常只在API中接受令牌直到过期日期。但是,如果用户想要令牌撤销,我需要采用一种方法来检查每个请求的令牌状态。

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

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

回答

9

使用令牌的HMAC的要点是,服务器可以快速验证它,而不用调用任何外部数据存储(例如Redis,MySQL等)。由于没有共享状态(验证令牌的所有信息是令牌本身和HMAC的密钥),这具有向多个服务器很好地扩展的额外好处。

如果你有一个撤销令牌的黑名单,那么类似Redis的东西可能会很好(尽管比每个令牌验证的远程调用还要慢)。设置正确,Redis实例和API服务器之间的延迟时间较短,您应该在每个请求中看到< 10ms。

红利:另一种加快速度的方法是使用Bloom filter来处理被拒绝的API请求的高速缓存。这样,如果布隆过滤器将请求标记标记为可能被撤销,那么您只能访问Redis。请注意,由于这是另一层缓存,因此当令牌被拒绝时,您必须更新布隆过滤器的状态。

+0

我绝对考虑一个布隆过滤器。虽然我也想知道它是否使用单例缓存是一个可行的选项 – 2013-04-27 01:45:08

+1

如果你只有一台服务器,那么你有更多的选择,因为你只需要在一个地方维护状态。像Redis这样的外部服务器维护状态允许您拥有多个API服务器。单身人士只适用于你有一台服务器的情况。另一种选择是分布式地图(连贯,Hazelcast等)。如果令牌的到期时间相对较短,那么您也可以在分布式映射到期时从分布式映射中删除,以减小它的大小。 – sehrope 2013-04-27 01:49:22

+0

优秀的答案。非常感谢! – 2013-04-27 01:57:19

2

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

+0

我实际上在我的AngularJS网站上使用了存储在sessionStorage中的JWT令牌。每当浏览器应用程序关闭时,他们都必须登录。这也是30分钟到期时间,用户将不得不重新签发另一个令牌。我只是简单地使用redis来记录它,它可以让我很快找到令牌。 – 2014-05-04 04:20:11

6

我实现了类似的功能来处理JWT生成的撤销令牌。

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

相关问题