Cliente Ktor IO, cómo prevenir la invocación de múltiples refreshTokens.
He implementado la característica Auth
con el token bearer
. Aquí está la implementación de mi refreshTokens
:
refreshTokens {
val fullUrl = "$baseUrl/auth/token:refresh"
val refreshToken = preference.get(PreferenceKeys.REFRESH_TOKEN.key)
val authData = tokenClient.post<AuthResponse>(fullUrl) {
body = AuthResponse(null, refreshToken)
header(HttpHeaders.ContentType, ContentType.Application.Json)}
BearerTokens(
accessToken = authData.accessToken ?: "",
refreshToken = authData.refreshToken ?: "")
}
y funciona como se esperaba, si solo se ha realizado una solicitud, pero si se reciben múltiples solicitudes de error 401 No autorizado
al mismo tiempo, esta devolución de llamada se activará varias veces. ¿Existen mecanismos de bloqueo que deba implementar para evitar la actualización múltiple de tokens? Gracias
davy.ai
Mecanismos de bloqueo para prevenir la actualización múltiple de tokens
Sí, existen mecanismos de bloqueo que puedes implementar para evitar la actualización múltiple de tokens. Una solución es utilizar un indicador booleano que indique si una actualización de token está en curso.
Antes de realizar cualquier solicitud, debes verificar si la indicador está establecido. Si lo está, debes esperar a que se complete la actualización antes de realizar la solicitud. Si no está establecido, debes establecer el indicador en verdadero y continuar con la solicitud.
Una vez que se completa la actualización, debes restablecer el indicador. De esta manera, puedes evitar que múltiples actualizaciones de token ocurran simultáneamente.
Aquí tienes un ejemplo de implementación utilizando un indicador booleano:
En este ejemplo,
synchronized
se utiliza para garantizar que solo un hilo pueda acceder al indicadorisRefreshingTokens
a la vez. Esto evita condiciones de carrera donde varios hilos pueden intentar actualizar tokens simultáneamente.Al utilizar este mecanismo de bloqueo, puedes asegurar que solo se realice una actualización de token a la vez, incluso si se realizan múltiples solicitudes simultáneamente.