Нормальные токены
This commit is contained in:
@@ -5,9 +5,7 @@ import okhttp3.Interceptor
|
||||
import okhttp3.Response
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
@Singleton
|
||||
class AuthInterceptor @Inject constructor(
|
||||
@@ -15,6 +13,10 @@ class AuthInterceptor @Inject constructor(
|
||||
private val navigationManager: core.utils.NavigationManager,
|
||||
private val authRepositoryProvider: javax.inject.Provider<auth.domain.repository.AuthRepository>
|
||||
) : Interceptor {
|
||||
|
||||
@Volatile
|
||||
private var isRefreshing = false
|
||||
|
||||
override fun intercept(chain: Interceptor.Chain): Response {
|
||||
val token = tokenManager.getToken()
|
||||
val request = chain.request().newBuilder().apply {
|
||||
@@ -23,16 +25,55 @@ class AuthInterceptor @Inject constructor(
|
||||
}
|
||||
}.build()
|
||||
|
||||
val response = chain.proceed(request)
|
||||
var response = chain.proceed(request)
|
||||
|
||||
if (response.code == 401) {
|
||||
// Global logout
|
||||
kotlinx.coroutines.GlobalScope.launch(kotlinx.coroutines.Dispatchers.Main) {
|
||||
authRepositoryProvider.get().logout()
|
||||
navigationManager.logout()
|
||||
// Attempt to refresh token synchronously
|
||||
val refreshedToken = refreshAuthToken()
|
||||
|
||||
if (refreshedToken != null) {
|
||||
// Close the old response before retrying
|
||||
response.close()
|
||||
|
||||
// Retry the original request with the new token
|
||||
val retryRequest = chain.request().newBuilder()
|
||||
.addHeader("Authorization", "Bearer $refreshedToken")
|
||||
.build()
|
||||
response = chain.proceed(retryRequest)
|
||||
} else {
|
||||
// Refresh failed, logout
|
||||
logoutUser()
|
||||
}
|
||||
}
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
private fun refreshAuthToken(): String? {
|
||||
if (isRefreshing) {
|
||||
// Already refreshing, wait and return current token
|
||||
return tokenManager.getToken()
|
||||
}
|
||||
|
||||
return runBlocking {
|
||||
isRefreshing = true
|
||||
try {
|
||||
val result = authRepositoryProvider.get().refreshToken()
|
||||
if (result.isSuccess) {
|
||||
result.getOrNull()?.token
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} finally {
|
||||
isRefreshing = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun logoutUser() {
|
||||
runBlocking {
|
||||
authRepositoryProvider.get().logout()
|
||||
}
|
||||
navigationManager.logout()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user