我的问题是确定何时刷新访问令牌。
我读过,我应该在每次请求之前刷新新的访问令牌,但它在其他地方说不建议这样做。所以我的问题是我是否应该在每次请求之前刷新访问令牌,或者发送请求并在收到 401 未经授权状态后刷新访问令牌并重试对指定资源的请求。
您可以采取任何一种方式,您知道您的访问令牌即将过期,例如 1 分钟前,您使用刷新令牌来获取一组新的刷新/访问令牌。
在 401 上执行此操作也是一种选择,但这意味着您需要执行额外的请求,并且还需要注意一些竞争条件,因为在许多配置中您只允许一次性使用刷新令牌(您每次都会获得一个新的刷新令牌)。因此,使用 401 方法,您需要确保不会发送许多并发请求来为同一用户获取新令牌。
您可以从访问令牌获取到期时间(通常在名为
exp
的字段中,格式为 unix 时间戳)。因此,每当您准备向资源服务器发送 HTTP 请求时,您都可以检查访问令牌是否已经过期或即将过期(例如 60 秒)。
如果是,请尝试使用刷新令牌获取新的访问令牌,并更新返回的存储在应用程序内的新访问令牌和刷新令牌。否则,只需继续使用现有的访问令牌即可。
为每个请求获取新的访问令牌是一种非常糟糕的做法,应该避免,因为它可能会导致性能和安全问题。此外,只要您拥有有效的、未过期的访问令牌,就根本不需要这样做。
要在过期(或即将过期)时获取新的访问令牌,有两种方法:
我认为后者更方便,我会建议它。第一种方法的问题是:
总而言之,我会采用“过期前刷新”的方法。