Prechádzať zdrojové kódy

fix NetworkModule - add header with token from secure storage in interceptor
remove manual adding token from source and from db

MrOzOn 5 rokov pred
rodič
commit
068498704e

+ 1 - 1
app/src/main/java/com/mrozon/healthdiary/di/FacadeComponent.kt

@@ -22,7 +22,7 @@ interface FacadeComponent : ProvidersFacade {
             DaggerFacadeComponent.builder()
                 .appProvider(AppComponent.create(application))
                 .databaseProvider(CoreProvidersFactory.createDatabaseBuilder(AppComponent.create(application)))
-                .networkProvider(CoreProvidersFactory.createNetworkBuilder())
+                .networkProvider(CoreProvidersFactory.createNetworkBuilder(AppComponent.create(application)))
                 .securityTokenProvider(CoreProvidersFactory.createSecurityTokenBuilder(AppComponent.create(application)))
                 .build()
     }

+ 2 - 2
core/src/main/java/com/mrozon/core/CoreProvidersFactory.kt

@@ -13,8 +13,8 @@ object CoreProvidersFactory {
         return DaggerDatabaseComponent.builder().appProvider(appProvider).build()
     }
 
-    fun createNetworkBuilder(): NetworkProvider {
-        return DaggerNetworkComponent.create()
+    fun createNetworkBuilder(appProvider: AppProvider): NetworkProvider {
+        return DaggerNetworkComponent.builder().securityTokenProvider(createSecurityTokenBuilder(appProvider)).build()
     }
 
     fun createSecurityTokenBuilder(appProvider: AppProvider): SecurityTokenProvider {

+ 3 - 3
core_api/src/main/java/com/mrozon/core_api/db/HealthDiaryDao.kt

@@ -18,9 +18,9 @@ interface HealthDiaryDao {
     @Delete
     suspend fun deleteUser(userDb: UserDb)
 
-    // TOKEN
-    @Query("SELECT user_token from user_table LIMIT 1")
-    fun getAccessToken(): String
+//    // TOKEN
+//    @Query("SELECT user_token from user_table LIMIT 1")
+//    fun getAccessToken(): String
 
     // PERSON
     @Query("SELECT * FROM person_table")

+ 5 - 6
core_api/src/main/java/com/mrozon/core_api/network/HealthDiaryService.kt

@@ -17,21 +17,20 @@ interface HealthDiaryService {
     suspend fun registerUser(@Body body: RegisterRequest): Response<RegisterResponse>
 
     @GET("patients/")
-    suspend fun getPersons(@Header("Authorization") token: String): Response<List<PersonResponse>>
+    suspend fun getPersons(): Response<List<PersonResponse>>
 
     @POST("patients/")
-    suspend fun addPerson(@Header("Authorization") token: String, @Body body: PersonRequest): Response<PersonResponse>
+    suspend fun addPerson(@Body body: PersonRequest): Response<PersonResponse>
 
     @DELETE("patients/{id}/")
-    suspend fun deletePerson(@Header("Authorization") token: String, @Path("id") id: String): Response<Unit>
+    suspend fun deletePerson(@Path("id") id: String): Response<Unit>
 
     @PUT("patients/{id}/")
-    suspend fun editPerson(@Header("Authorization") token: String,
-                           @Path("id") id: String,
+    suspend fun editPerson(@Path("id") id: String,
                            @Body body: PersonRequest): Response<PersonResponse>
 
     @POST("add-user-to-patient/")
-    suspend fun sharePerson(@Header("Authorization") token: String, @Body body: SharePersonRequest): Response<PersonResponse>
+    suspend fun sharePerson(@Body body: SharePersonRequest): Response<PersonResponse>
 
 //    @GET("lego/themes/")
 //    suspend fun getThemes(@Query("page") page: Int? = null,

+ 1 - 1
core_api/src/main/java/com/mrozon/core_api/network/model/LoginResponse.kt

@@ -17,7 +17,7 @@ fun LoginResponse.toUserDb(): UserDb {
         email = email,
         firstname = first_name,
         lastname = last_name,
-        token = token
+        token = ""
     )
 }
 

+ 3 - 2
core_impl/src/main/java/com/mrozon/core_impl/crypto/SecurityTokenServiceImpl.kt

@@ -14,6 +14,7 @@ class SecurityTokenServiceImpl @Inject constructor(
 
     companion object {
         const val FILE_NAME = "access_token"
+        const val FIELD_NAME = "token"
     }
 
     private var ssp: SharedPreferences
@@ -32,12 +33,12 @@ class SecurityTokenServiceImpl @Inject constructor(
     }
 
     override fun loadAccessToken(): String {
-        return ssp.getString("token","")?:""
+        return ssp.getString(FIELD_NAME,"")?:""
     }
 
     override fun saveAccessToken(string: String) {
         ssp.edit()
-            .putString("token",string)
+            .putString(FIELD_NAME,string)
             .apply()
     }
 }

+ 4 - 0
core_impl/src/main/java/com/mrozon/core_impl/network/NetworkComponent.kt

@@ -1,11 +1,15 @@
 package com.mrozon.core_impl.network
 
 import com.mrozon.core_api.network.NetworkProvider
+import com.mrozon.core_api.providers.AppProvider
+import com.mrozon.core_api.security.SecurityTokenProvider
+import com.mrozon.core_api.security.SecurityTokenService
 import dagger.Component
 import javax.inject.Singleton
 
 @Singleton
 @Component(
+    dependencies = [SecurityTokenProvider::class],
     modules = [NetworkModule::class]
 )
 interface NetworkComponent : NetworkProvider

+ 10 - 1
core_impl/src/main/java/com/mrozon/core_impl/network/NetworkModule.kt

@@ -4,6 +4,7 @@ import okhttp3.logging.HttpLoggingInterceptor.Level.BODY
 import okhttp3.logging.HttpLoggingInterceptor.Level.NONE
 import com.google.gson.Gson
 import com.mrozon.core_api.network.HealthDiaryService
+import com.mrozon.core_api.security.SecurityTokenService
 import com.mrozon.core_impl.BuildConfig
 import dagger.Module
 import dagger.Provides
@@ -30,9 +31,17 @@ class NetworkModule {
         HttpLoggingInterceptor().apply { level = if (BuildConfig.DEBUG) BODY else NONE }
 
     @Provides
-    fun provideOkHttpClient(interceptor: HttpLoggingInterceptor): OkHttpClient =
+    fun provideOkHttpClient(interceptor: HttpLoggingInterceptor, security: SecurityTokenService): OkHttpClient =
         OkHttpClient.Builder()
             .addInterceptor(interceptor)
+            .addInterceptor { chain ->
+                val newRequestBuilder = chain.request().newBuilder()
+                val token = security.loadAccessToken()
+                if (token.isNotEmpty()) {
+                    newRequestBuilder.addHeader("Authorization", "Token $token")
+                }
+                chain.proceed(newRequestBuilder.build())
+            }
             .build()
 
     @Singleton

+ 4 - 2
feature_auth/src/main/java/com/mrozon/feature_auth/data/UserAuthRepositoryImpl.kt

@@ -4,6 +4,7 @@ import com.mrozon.core_api.db.HealthDiaryDao
 import com.mrozon.core_api.entity.User
 import com.mrozon.core_api.mapper.UserToUserDbMapper
 import com.mrozon.core_api.network.model.*
+import com.mrozon.core_api.security.SecurityTokenService
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flow
 import javax.inject.Inject
@@ -16,7 +17,8 @@ import timber.log.Timber
 
 @Singleton
 class UserAuthRepositoryImpl @Inject constructor(private val userAuthRemoteDataSource: UserAuthRemoteDataSource,
-                                                 private val dao: HealthDiaryDao
+                                                 private val dao: HealthDiaryDao,
+                                                 private val securityTokenService: SecurityTokenService
 
 ): UserAuthRepository {
 
@@ -40,7 +42,7 @@ class UserAuthRepositoryImpl @Inject constructor(private val userAuthRemoteDataS
             val request = LoginRequest(username = userName, password = password)
             val response = userAuthRemoteDataSource.loginUser(request)
             if (response.status == Result.Status.SUCCESS) {
-                Timber.d("sahdksdh")
+                securityTokenService.saveAccessToken(response.data!!.token)
                 dao.insertUser(response.data!!.toUserDb())
                 emit(success(response.data!!.toUser()))
             } else if (response.status == Result.Status.ERROR) {

+ 5 - 10
feature_person/src/main/java/com/mrozon/feature_person/data/PersonRemoteDataSource.kt

@@ -12,31 +12,26 @@ class PersonRemoteDataSource @Inject constructor(private val service: HealthDiar
 
     suspend fun getPersons()
             = getResult {
-                val token = "Token "+dao.getAccessToken()
-                service.getPersons(token)
+                service.getPersons()
             }
 
     suspend fun addPersons(personRequest: PersonRequest)
             = getResult {
-        val token = "Token "+dao.getAccessToken()
-        service.addPerson(token, personRequest)
+        service.addPerson(personRequest)
     }
 
     suspend fun deletePerson(id: Long)
             = getResult {
-        val token = "Token "+dao.getAccessToken()
-        service.deletePerson(token, id.toString())
+        service.deletePerson(id.toString())
     }
 
     suspend fun editPerson(id: Long, personRequest: PersonRequest)
             = getResult {
-        val token = "Token "+dao.getAccessToken()
-        service.editPerson(token, id.toString(), personRequest)
+        service.editPerson(id.toString(), personRequest)
     }
 
     suspend fun sharePerson(sharePersonRequest: SharePersonRequest)
             = getResult {
-        val token = "Token "+dao.getAccessToken()
-        service.sharePerson(token, sharePersonRequest)
+        service.sharePerson(sharePersonRequest)
     }
 }