【问题标题】:best practices for refreshing access tokens automatically自动刷新访问令牌的最佳实践
【发布时间】:2020-05-18 20:49:38
【问题描述】:

我正在构建一个使用 spotify web api 的反应原生应用程序。我正在使用授权代码流来授权用户。首先,我得到一个授权码,可用于获取访问令牌和刷新令牌。一切正常!

问题是:访问令牌仅在有限的时间内有效。这就是刷新令牌的用武之地。我理解这个概念,但我对如何实现这一点感到头疼。

假设用户打开应用程序,请求访问令牌并使用它一段时间。然后,用户关闭应用程序。 15 分钟后,用户再次打开应用程序。访问令牌现已过期,因此我需要申请新的访问令牌。

我提出了几个“解决方案”。有人可以指出正确的解决方案吗?

解决方案 1: 每次用户打开应用程序时,我都会请求一个新的访问令牌并使用它。问题:当用户使用应用程序的时间超过访问令牌的有效时间时,我将不再工作。

解决方案 2: 我对每个请求都使用存储在安全存储中的访问令牌。当请求返回“访问令牌无效”时(我不知道确切的错误代码,但你们知道我的意思),我用存储的刷新令牌请求一个新的访问令牌,然后我再次发送上一个命令(使用新的访问令牌)。但我的问题是:我可以使用某种“包装函数”来检查请求的响应,如果响应是“访问令牌无效”,它会自动请求一个新的访问令牌并再次运行之前的请求。

【问题讨论】:

标签: react-native oauth spotify


【解决方案1】:

我认为当然正确的解决方案是解决方案 2,我认为它已经足够清晰了。

对于使用解决方案 2,您需要类似包装函数的东西,是的,它很智能。

所以你应该使用拦截器

什么是拦截器?

您可以在请求或响应被 then 或 catch 处理之前拦截它们。

在下面的链接中有一个在 axios 拦截器中实现刷新令牌的好例子:

https://gist.github.com/Godofbrowser/bf118322301af3fc334437c683887c5f

【讨论】:

    【解决方案2】:

    我同意解决方案 2 是最好的,每次您发出请求时,您都可以检查 Access Token 是否已过期,如果已过期,则可以请求新的 使用您提到的 Refresh Token 访问令牌,然后提出您的请求,在我自己的项目中,我在调用 FormatRequestHeadersAsync 方法中执行此操作CheckAndRenewTokenAsync 方法,我执行以下检查,这里显示在 C# 中:

    if(AccessToken?.Refresh != null && (AccessToken.Expiration < DateTime.UtcNow))
    {
        AccessToken = await GetRefreshTokenAsync(
            AccessToken.Refresh, 
            AccessToken.TokenType, 
            cancellationToken);
    }
    

    您可以存储 Access TokenRefresh Token,然后在向 API 发出每个请求之前使用类似的东西,这将刷新您的令牌,然后您可以存储新的Access Token和现有的Refresh Token

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 2020-11-09
      • 2012-08-02
      • 2015-05-24
      • 1970-01-01
      • 2019-03-23
      • 2011-08-13
      • 2020-05-02
      • 2015-10-05
      相关资源
      最近更新 更多