Ruby on rails 门卫刷新令牌和并发

Ruby on rails 门卫刷新令牌和并发,ruby-on-rails,ruby,oauth-2.0,doorkeeper,Ruby On Rails,Ruby,Oauth 2.0,Doorkeeper,在doorkeeper的当前实现中,当访问令牌被刷新时,doorkeeper也会发送一个新的刷新令牌。这是一个有效的实现,但当我的客户端(ios、android)同时调用API刷新访问令牌时,就会出现问题。这意味着至少有一个线程以无法刷新的过期令牌结束 任何人都有解决这种竞赛条件的方法吗?我们以前用过几种不同的方法(不是用看门人)来解决这个问题 请求队列: 在我们的移动应用程序上,我们实现了一个请求队列,在发出请求之前,我们检查令牌是否需要刷新,然后暂停队列,刷新令牌,然后再次取消暂停。在这种情

在doorkeeper的当前实现中,当访问令牌被刷新时,doorkeeper也会发送一个新的刷新令牌。这是一个有效的实现,但当我的客户端(ios、android)同时调用API刷新访问令牌时,就会出现问题。这意味着至少有一个线程以无法刷新的过期令牌结束

任何人都有解决这种竞赛条件的方法吗?

我们以前用过几种不同的方法(不是用看门人)来解决这个问题

请求队列

在我们的移动应用程序上,我们实现了一个请求队列,在发出请求之前,我们检查令牌是否需要刷新,然后暂停队列,刷新令牌,然后再次取消暂停。在这种情况下,不需要更改服务器

这是一个折衷方案(您需要同步请求线程等),但在停止刷新争用时非常可靠,无需修改服务器

刷新抖动和JWT

由于我们使用的是JWT(其中,
access\u令牌
expiration被写入令牌,而不是在服务器端撤销),因此每次检查时,您都可以向刷新到期添加随机数的“抖动秒”。这降低了两个请求同时尝试刷新的可能性。我在一个AngularJS应用程序中使用了它,它会被打开的几个标签弄糊涂。有一种随机的可能性,一个选项卡会在其余选项卡之前刷新,而其余选项卡可以继续使用其现有的
access\u令牌
,直到返回并更新新选项卡

如果您能够设法使您的access_令牌在使用其相应的刷新令牌时保持有效,这可能在没有JWT的情况下也能起作用,这将允许“其他”请求继续使用其“旧”令牌,直到下一次

这并不是万无一失的,但却大大降低了我们对它感到满意的可能性

令牌的到期缓冲区


最后一种方法是在执行刷新时,不要在几秒钟后使令牌过期,这样任何“并发”线程都只会返回新令牌。当我从头开始编写服务器组件时,这已经足够容易了,但对于doorkeeper来说可能不是那么容易。我想你会从另外两种方法中得到更多的启发。

谢谢你的回答。我将尝试看看是否可以在客户端实现请求队列。