Skip to content

Commit

Permalink
WIP: add token
Browse files Browse the repository at this point in the history
  • Loading branch information
Iulia Stana committed Mar 7, 2023
1 parent 20ed429 commit 85ff063
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 48 deletions.
38 changes: 14 additions & 24 deletions app/src/main/kotlin/nl/eduid/di/auth/TokenAuthenticator.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
}
}
}
28 changes: 15 additions & 13 deletions app/src/main/kotlin/nl/eduid/di/auth/TokenInterceptor.kt
Original file line number Diff line number Diff line change
@@ -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)
}
}
22 changes: 12 additions & 10 deletions app/src/main/kotlin/nl/eduid/di/auth/TokenProvider.kt
Original file line number Diff line number Diff line change
@@ -1,38 +1,40 @@
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 {
//Todo: to an actual token refresh here
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
}
}
3 changes: 2 additions & 1 deletion app/src/main/kotlin/nl/eduid/di/module/EduIdModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ internal object RepositoryModule {
}

return builder.addInterceptor(tokenInterceptor)
.authenticator(tokenAuthenticator).build()
.authenticator(tokenAuthenticator)
.build()
}

@Provides
Expand Down

0 comments on commit 85ff063

Please sign in to comment.