From 85ff063a3a9dd3011529f72a726ac291ccb76c5b Mon Sep 17 00:00:00 2001 From: Iulia Stana Date: Tue, 7 Mar 2023 09:12:53 +0100 Subject: [PATCH] WIP: add token --- .../nl/eduid/di/auth/TokenAuthenticator.kt | 38 +++++++------------ .../nl/eduid/di/auth/TokenInterceptor.kt | 28 +++++++------- .../kotlin/nl/eduid/di/auth/TokenProvider.kt | 22 ++++++----- .../kotlin/nl/eduid/di/module/EduIdModule.kt | 3 +- 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/app/src/main/kotlin/nl/eduid/di/auth/TokenAuthenticator.kt b/app/src/main/kotlin/nl/eduid/di/auth/TokenAuthenticator.kt index 546b8779..c5192d64 100644 --- a/app/src/main/kotlin/nl/eduid/di/auth/TokenAuthenticator.kt +++ b/app/src/main/kotlin/nl/eduid/di/auth/TokenAuthenticator.kt @@ -1,7 +1,5 @@ package nl.eduid.di.auth -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking import okhttp3.Authenticator import okhttp3.Request import okhttp3.Response @@ -13,30 +11,22 @@ class TokenAuthenticator @Inject constructor( private val tokenProvider: TokenProvider ) : Authenticator { - private var currentToken: String? = - "eyJraWQiOiJrZXlfMjAyM18wM18wN18wMF8wMF8wMF8wMTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZGV2LmVnZW5pcS5ubCIsIm15Y29uZXh0LnJzIl0sInN1YiI6ImRldi5lZ2VuaXEubmwiLCJuYmYiOjE2NzgxNzI2MDYsInNjb3BlIjoiZWR1aWQubmxcL21vYmlsZSIsImlzcyI6Imh0dHBzOlwvXC9jb25uZWN0LnRlc3QyLnN1cmZjb25leHQubmwiLCJjbGFpbXMiOiJBUTkxeUt6RTRRTW5odTdkaXZuMGRlQ1wvMm5CaWY1M1Jpa1laVWFPWktiNkVaQWJnbzdZY1RKSFNiQTVWeVwvejg4Y3JOYmZSQmJscnNqNDk3eGc2cXhaNll2YStXNkdoOFpTXC8xakxRQ2QzV3E1b05hajlkZkFJQjVLWDRBXC9hSEhXUDN6M0wycmlUSitJTlF5Uk5BOTkrUDZ0UWFPSWd3aFwvYmRUcllRZEVNQU1GeXVwSkh1b0tDU0pZR2kwNDY3Nnp5aGNkeXVncU9WOG1nR3JvTVFWZExKdTBFRzJ3V0laSVhUUmlsbXJmdzhqYittaW5wS01mY0pRb1NQYWVLbVNJdWx1OUU3WW14YmI3Z09kMEpMN3BkY2lrZUFId1pvazBCdDg5XC8rcnNzNlFxbUxWQVRGa1Qyb0YzK0h6amowVGtmdFFIRW44OGZOS1BoUGQ4U1wvS25EQytpTDlpQ3BEZkdcL2xpWWw4SUJHYUNwRnpOWjROd2JxaEM3YnpiVkZiVEdSK3ZTa2JqRTlFZ00yXC9UZk9KckNRaDM0c1VKXC9nVUJOc1JnV1EyeUpYSkl5Rk9IZWtiR3gyV0o1WkUxZ1wvV0pzcENZYXRUTFhIQ2pvSU9YdkVRRWNmZlNYWlFWbThBb09hbG9OWEFuNDZ1UjBZRXdtNk9xekFkcjlVcEp1Tjg1VVlYZDcxMStCcFEyQW1FQ3BMMWJYXC8zaFlcL1lhZzNMQzZsV2xROERuS1VkXC9xUitJMmdmbzlaZmk2R1NqOVl3dWxhbHBrcjdSOWpnTWNYQTZlRWc0R0JUdEdGK1BGdlwvaFQxMXBLZ3RQWlZqeVA1dlI5KzRDOE1qY1NtU0s1bzg2eitqVkk3Y1RkSk1odjRRSFA2ZUF2aFRoc0dvRElLV2wwbjVIIiwiZXhwIjoxNjc4MTc2MjA2LCJjbGFpbV9rZXlfaWQiOiIyNTkzNzczMjQiLCJpYXQiOjE2NzgxNzI2MDYsImp0aSI6ImJkZWFmOTU2LWExZjUtNDFjZC1hMTVmLWY4MGZhMzM2ZDA0OSJ9.pXguHBZ8eor1CdNmWZKZaJW4jdeGQGrz6XIBZf13-ZUkr3HQu5KlH9RT4wIDF_3cnfmlqqE6tn5DOBG-4xdyVbfcbyEM4seckT55XcturQlrW-QXL9v6jq2jk5QAp0b8Foj7LYGc1pqPIaPQj_WaOBq8ddtrY8uqf4npapM_5nNe8w2z3Y6F3xQ4rkgfyJ1bKtupYJK7aGEBhbN75hkyV4TbkWh9Jwv2cBazxpLfUNbg05W32PFcrTyNIX5lslu-meCzSe6SKctLIjfFdQPpvZlPDXF_hoiyBW-r98SpQOf0CQBHyvYu4YubpQXXP5EvUkLZPM02zLJTUun2EIRAng" + private var currentToken: String? = null - override fun authenticate(route: Route?, response: Response): Request? { - synchronized(this) { - Timber.e("Authenticator intercept. Running on: ${Thread.currentThread().name}") - val previousToken = currentToken - return response.request.newBuilder().header( - "Authorization", "Bearer $currentToken" - ).build() + override fun authenticate(route: Route?, response: Response): Request? = synchronized(this) { + val token = tokenProvider.refreshToken() + val previousToken = currentToken -// return runBlocking(Dispatchers.IO) { -// Timber.e("Blocking. Running on: ${Thread.currentThread().name}") -// val token = tokenProvider.refreshToken() -// -// if (token != previousToken) { -// currentToken = token -// response.request.newBuilder().header( -// "Authorization", "Bearer $token" -// ).build() -// } else { -// null -// } -// } + return if (token != previousToken) { + Timber.e("A - Adding authorization to header") + currentToken = token + response.request.newBuilder().header( + "Authorization", + "Bearer $token" + ).build() + } else { + Timber.e("A - Not adding any token. Current token: ${currentToken != null}") + null } } } \ No newline at end of file diff --git a/app/src/main/kotlin/nl/eduid/di/auth/TokenInterceptor.kt b/app/src/main/kotlin/nl/eduid/di/auth/TokenInterceptor.kt index f32bf90b..cb42c2e1 100644 --- a/app/src/main/kotlin/nl/eduid/di/auth/TokenInterceptor.kt +++ b/app/src/main/kotlin/nl/eduid/di/auth/TokenInterceptor.kt @@ -1,26 +1,28 @@ package nl.eduid.di.auth -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking import okhttp3.Interceptor import okhttp3.Response +import timber.log.Timber import javax.inject.Inject class TokenInterceptor @Inject constructor(private val tokenProvider: TokenProvider) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() - if (request.header("Authorization") == null) { - return runBlocking(Dispatchers.IO) { - val token = tokenProvider.getToken() - if (token != null) { - chain.proceed( - request.newBuilder().addHeader("Authorization", "Bearer $token").build() - ) - } else { - chain.proceed(request) - } + return if (request.header("Authorization") == null) { + Timber.e("0 - Request requires authorization") + val token = tokenProvider.getToken() + if (token != null) { + Timber.e("1 - Have a non-null token. Adding authorization headers") + chain.proceed( + request.newBuilder().addHeader("Authorization", "Bearer $token").build() + ) + } else { + Timber.e("1 - Token is null") + chain.proceed(request) } + } else { + Timber.e("1 - Request does not require authorization header") + chain.proceed(request) } - return chain.proceed(request) } } \ No newline at end of file diff --git a/app/src/main/kotlin/nl/eduid/di/auth/TokenProvider.kt b/app/src/main/kotlin/nl/eduid/di/auth/TokenProvider.kt index 594f689f..637e4e73 100644 --- a/app/src/main/kotlin/nl/eduid/di/auth/TokenProvider.kt +++ b/app/src/main/kotlin/nl/eduid/di/auth/TokenProvider.kt @@ -1,21 +1,24 @@ package nl.eduid.di.auth +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.runBlocking import nl.eduid.di.repository.StorageRepository import timber.log.Timber import java.util.* import kotlin.NoSuchElementException class TokenProvider(private val repository: StorageRepository) { - private var token: String? = - "eyJraWQiOiJrZXlfMjAyM18wM18wMl8wMF8wMF8wMF8wMDAiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZGV2LmVnZW5pcS5ubCIsIm15Y29uZXh0LnJzIl0sInN1YiI6ImRldi5lZ2VuaXEubmwiLCJuYmYiOjE2Nzc3NzMxNjMsInNjb3BlIjoiZWR1aWQubmxcL21vYmlsZSIsImlzcyI6Imh0dHBzOlwvXC9jb25uZWN0LnRlc3QyLnN1cmZjb25leHQubmwiLCJjbGFpbXMiOiJBUTkxeUt4S3UrOEFjcFlhd0lYdTVwK1lFK01RSFpocTJiUVBMYlZMTE9IWmt0dUJBMDFTNXZ4M2dtVmpzdllldFYyMFVtVGJFMDl6SjMzSENKNk1kVjE3SWxGSDdiK1ZpMUkyKzBFQThWVFdWdlwvQkpmcnkxcFBLVGJ4dWdMbFNaN0tHRGdzamp3VU9DWW8wS3JmTmYxK0VZVUMyeWIxdXV0a0lFWWx1WHZRT2RCY1JicjRCellpbkFSMUY3Y0FcL2swVUlWSFpSRU9wVjRCejNuODc0SWZxOFJZT2NsaldkUjF2XC9cL0V3Q00zUDRCM2s4dFRLVnBzaU13Y0tjVlZ6dWhIWkZaZHFONVhUMWZXSHhNMW1RekFoQVpJdnFSbXpYOGx5MFEzTXU4ZEdQSE9SS1h5djgzUkFBRDBXbmpFYWhUXC9zNUppWnowUEtZdm9xSmV0WTZieUF5cVdMQUwzMDVDOUpHaXRCZGxtdjdvcWFWczJDeFNnSGhydFNSQWZSSXAxQURyU2oxWktLaVBBS3NuMDNuZ3duK250d1wvRnBVVU1kQ1Y3SU95QWtxS2lHREJsVUJ4aDlNK0N6M3V5TUtiYmlnUVZHV1pzMUZONmt3b01oTm43MllQbzRCZjBLNnNqVll5VUVzMWlpUUJNckZxS01LQlZFa3V3MkZTV2RvMXVyYmdYKzFsQTZROFpkQlNORlE3WnVPOWU5Q1E5MHhDS2tDV1NjbyswcFdBbHFRWWhLaVEyOHBNOWphblwvcWxsVjJST2dmaE45a0JqejllaldKUUpJK0x1V3kzZUxSQmcyalwvcWlrZmt6elJvRVwvb21Ba1VSOUsxbHNzNTZ6Rm9pUUtSeUZySTBtU0xcL2tHQnhERmR5anBHa3J5Z0FLRUtLVUsyaiIsImV4cCI6MTY3Nzc3Njc2MywiY2xhaW1fa2V5X2lkIjoiMjU5Mzc3MzI0IiwiaWF0IjoxNjc3NzczMTYzLCJqdGkiOiI0YWJmOGRmNy02MzQxLTQ3NjUtYTQyNy1iOTU3MzY5YTRkN2MifQ.V3x94XrR_xBWejsJwlU0HTEO7AejEd770DJoH1iSfIk1ChVgdaZU1XX1BZzPji8pVEuB22aJCps5EAoMX5aNP3qkF7r7FDDqdhsRdT-2n855uOeT_6VGQ10caz5wO4HFOxSUZRn-9EJOfQNb-FYLI8ZlqdGy6JpjCBrHOKzRgFYjQjMmTM2zbx6ahyLk4bj_STU-jPnDgPvL4L05UcuR1WwBfGkcnVOpteZSnb4Hm64ibD9Zp7YdAVPSI39iHoq-z3ZieIbryZbu4FCUdkv0dgi0Oo3ueb0mTD14K2YCdOBw15SbfLertnS8L-aNg08cx-6xcp0S2VXE0K7dcJD_1g" + private var token: String? = null - suspend fun getToken(): String? = token ?: refreshToken() + fun getToken(): String? = runBlocking(Dispatchers.IO) { + token ?: refreshToken() + } - suspend fun refreshToken(): String? { + fun refreshToken(): String? = runBlocking(Dispatchers.IO) { token = if (!repository.isAuthorized.first()) { - Timber.e("Not authorized. Token missing") + Timber.d("\tNot authorized. Token missing") null } else { try { @@ -23,16 +26,15 @@ class TokenProvider(private val repository: StorageRepository) { val authState = repository.authState.firstOrNull() val expiresAt = Date(authState?.accessTokenExpirationTime ?: 0) val accessToken = authState?.accessToken - Timber.e( - "Is authorized. token is available: $accessToken, expires at $expiresAt" + Timber.d( + "\tIs authorized. Token expires at $expiresAt. \n\t Token: $accessToken" ) accessToken } catch (ex: NoSuchElementException) { - Timber.w(ex, "Error refreshing token") + Timber.w(ex, "\tError refreshing token") null } } - return token - + token } } \ No newline at end of file diff --git a/app/src/main/kotlin/nl/eduid/di/module/EduIdModule.kt b/app/src/main/kotlin/nl/eduid/di/module/EduIdModule.kt index b61d8936..6ab77010 100644 --- a/app/src/main/kotlin/nl/eduid/di/module/EduIdModule.kt +++ b/app/src/main/kotlin/nl/eduid/di/module/EduIdModule.kt @@ -78,7 +78,8 @@ internal object RepositoryModule { } return builder.addInterceptor(tokenInterceptor) - .authenticator(tokenAuthenticator).build() + .authenticator(tokenAuthenticator) + .build() } @Provides