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

React native 自动刷新访问令牌的最佳实践,react-native,oauth,spotify,React Native,Oauth,Spotify,我正在构建一个react本机应用程序,它使用。我正在使用授权代码流来授权用户。首先,我得到一个授权码,可以用来获取访问令牌和刷新令牌。一切正常 问题是:访问令牌仅在有限的时间内有效。这就是刷新令牌的作用。我理解这一概念,但对于如何实现这一点,我的头脑已经崩溃了 假设用户打开应用程序,请求访问令牌,并使用该令牌一段时间。然后,用户关闭应用程序。15分钟后,用户再次打开应用程序。访问令牌现在已过期,因此我需要请求一个新的访问令牌 我提出了几个“解决方案”。有人能给我指出正确的解决办法吗 解决方案1:

我正在构建一个react本机应用程序,它使用。我正在使用授权代码流来授权用户。首先,我得到一个授权码,可以用来获取访问令牌和刷新令牌。一切正常

问题是:访问令牌仅在有限的时间内有效。这就是刷新令牌的作用。我理解这一概念,但对于如何实现这一点,我的头脑已经崩溃了

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

我提出了几个“解决方案”。有人能给我指出正确的解决办法吗

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

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

我认为正确的解决方案当然是解决方案2,而且我认为它足够清楚

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

因此,您应该使用拦截器

什么是拦截器?

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

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


我认为正确的解决方案当然是解决方案2,而且我认为它足够清晰

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

因此,您应该使用拦截器

什么是拦截器?

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

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


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

if(AccessToken?.Refresh!=null&(AccessToken.Expiration

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

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

if(AccessToken?.Refresh!=null&(AccessToken.Expiration

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

不确定是否有用,但是我写了一个关于
fetch()
的包装,它确实做到了这一点:不确定是否有用,但我写了一个关于
fetch()
的包装,它确实做到了这一点:
if(AccessToken?.Refresh != null && (AccessToken.Expiration < DateTime.UtcNow))
{
    AccessToken = await GetRefreshTokenAsync(
        AccessToken.Refresh, 
        AccessToken.TokenType, 
        cancellationToken);
}