【问题标题】:Doorkeeper refresh token and concurrency门卫刷新令牌和并发
【发布时间】:2015-08-31 04:07:13
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby oauth-2.0 doorkeeper


    【解决方案1】:

    我们之前已经通过几种不同的方式解决了这个问题(不是用门卫)。

    请求队列

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

    这需要权衡(您需要同步请求线程等),但在停止刷新争用时非常可靠,无需修改服务器。

    刷新抖动和 JWT

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

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

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

    令牌的到期缓冲区

    最后一种方法是在执行刷新时,实际上不要在几秒钟后使令牌过期,这样任何“并发”线程都会返回新的令牌。当我从头开始编写服务器组件时,这很容易,但对于看门人来说可能就不那么容易了。我认为你会从其他两种方法中获得更多的里程数。

    【讨论】:

    • 感谢您的回答。我会尝试看看是否可以在客户端实现请求队列。
    猜你喜欢
    • 2020-02-04
    • 2012-07-19
    • 1970-01-01
    • 2017-04-21
    • 2022-10-22
    • 2017-11-07
    • 2017-11-20
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多