Ensure authentication token is always sent when it exists (#193)

* Ensure auth token is sent if it is present

* Allow using login token for other requests while API token is created

* Update version code
This commit is contained in:
Kirill Kamakin
2023-12-28 11:05:20 +01:00
committed by GitHub
parent ffdac4c616
commit 94f12820bc
12 changed files with 56 additions and 42 deletions

View File

@@ -1,6 +0,0 @@
package gq.kirmanak.mealient.datasource
interface SignOutHandler {
fun signOut()
}

View File

@@ -0,0 +1,6 @@
package gq.kirmanak.mealient.datasource
fun interface TokenChangeListener {
fun onTokenChange()
}

View File

@@ -6,7 +6,7 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import gq.kirmanak.mealient.datasource.SignOutHandler
import gq.kirmanak.mealient.datasource.TokenChangeListener
import io.ktor.client.HttpClient
import javax.inject.Singleton
@@ -37,5 +37,5 @@ internal interface KtorModule {
fun bindKtorClientBuilder(impl: KtorClientBuilderImpl) : KtorClientBuilder
@Binds
fun bindSignOutHandler(impl: SignOutHandlerKtor) : SignOutHandler
fun bindSignOutHandler(impl: TokenChangeListenerKtor): TokenChangeListener
}

View File

@@ -1,20 +0,0 @@
package gq.kirmanak.mealient.datasource.ktor
import gq.kirmanak.mealient.datasource.SignOutHandler
import io.ktor.client.HttpClient
import io.ktor.client.plugins.auth.Auth
import io.ktor.client.plugins.auth.providers.BearerAuthProvider
import io.ktor.client.plugins.plugin
import javax.inject.Inject
internal class SignOutHandlerKtor @Inject constructor(
private val httpClient: HttpClient,
) : SignOutHandler {
override fun signOut() {
httpClient.plugin(Auth)
.providers
.filterIsInstance<BearerAuthProvider>()
.forEach { it.clearToken() }
}
}

View File

@@ -0,0 +1,26 @@
package gq.kirmanak.mealient.datasource.ktor
import gq.kirmanak.mealient.datasource.TokenChangeListener
import gq.kirmanak.mealient.logging.Logger
import io.ktor.client.HttpClient
import io.ktor.client.plugins.auth.Auth
import io.ktor.client.plugins.auth.providers.BearerAuthProvider
import io.ktor.client.plugins.plugin
import javax.inject.Inject
internal class TokenChangeListenerKtor @Inject constructor(
private val httpClient: HttpClient,
private val logger: Logger,
) : TokenChangeListener {
override fun onTokenChange() {
logger.v { "onTokenChange() called" }
httpClient.plugin(Auth)
.providers
.filterIsInstance<BearerAuthProvider>()
.forEach {
logger.d { "onTokenChange(): removing the token" }
it.clearToken()
}
}
}