自动刷新访问令牌的最佳实践

时间:2020-05-18 20:49:38

标签: react-native oauth spotify

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

问题是:访问令牌仅在有限的时间内有效。这就是刷新令牌的用处。我理解这个概念,但是在实现该方法上却束手无策。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我认为正确的解决方案肯定是解决方案2,而且我认为它很清楚。

要使用解决方案2,您需要诸如包装器功能之类的东西,是智能的。

所以您应该使用拦截器

什么是拦截器?

您可以拦截请求或响应,然后再进行处理或捕获。

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

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

答案 1 :(得分:1)

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

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

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