He escrito una pequeña aplicación usando React Native y TS. En mi aplicación, uso la autorización a través access_token s con una duración de una hora. Cada vez que el token caduca, ejecuto la función refreshToken donde envío access_token y refresh_token que se guardaron previamente en el almacenamiento local y los envío a través del método POST.
básicamente algo como esto:
if (token_from_storage !== is_expired) { //assuming token is indeed in storage return access_token; } else { //this Function calls an api with refresh token const { tokens }: { tokens: ITokens } = await refreshToken(refresh_token); saveTokens(tokens); //here we save new access_token and refresh_token } después de refreshToken haya terminado, los nuevos tokens se guardan localmente (y se actualizaron en el nivel de base de datos) y deben usarse si desea actualizar los tokens nuevamente.
Por ejemplo, lanzamos una aplicación con un token caducado. Los métodos al principio serán getUserInfo() y getApplicationInfo() que obtienen algunos datos importantes. Se lanzan a través de redux-saga o algo similar (async).
//first app screen useEffect(() => { dispatch(ACTION_GET_USER_INFO); dispatch(ACTION_GET_APPLICATION_INFO); },[]) el primer método lanzaría refresh_token casi al mismo tiempo que el segundo. Los tokens se reconstruirán para el primer método y se actualizarán en el nivel de la base de datos. En el momento en que el segundo método llame a refreshToken (se lanzó al mismo tiempo; también piensa que el token está muerto), el refresh_token se cambiará en el nivel de la base de datos y no responderá 200 en la llamada refreshToken() .
¿Qué se debe hacer para lograr una correcta renovación?
Si entiendo su problema correctamente, parece que está llamando a dos funciones asíncronas que actualizan los tokens si el token actual ha caducado.
Esto indica que está experimentando una condición de carrera en su instrucción useEffect, y debido a que las solicitudes manejan la actualización de su token de forma independiente, al menos una de las solicitudes tendrá un token no válido.
Personalmente, no estaría manejando tokens en el cliente, especialmente con el almacenamiento local.
Sin embargo, si debe hacerlo, puede corregir la condición de carrera agregando una capa de servicio que maneje las solicitudes y los tokens de forma singular. Sus funciones de despacho pasarán a través de la capa de servicio que puede determinar la necesidad de actualizar un token y si un token ya se está actualizando de manera síncrona antes de intentar enviar las solicitudes.