Skip to content

Commit

Permalink
Merge pull request #90 from Team-HMH/fix/network
Browse files Browse the repository at this point in the history
[fix/network]: Network 기본 로직 수정
  • Loading branch information
jihyun0v0 authored Jan 12, 2024
2 parents c2c0f28 + a598b95 commit ac37bb9
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.hmh.hamyeonham.core.network.auth.api

import com.hmh.hamyeonham.core.network.auth.api.model.TokenResponse
import com.hmh.hamyeonham.core.network.model.BaseResponse
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.POST

interface RefreshApi {
@POST("api/v1/auth/token")
suspend fun refreshToken(@Header("Authorization") token: String): TokenResponse
interface RefreshService {
@GET("api/v1/user/reissue")
suspend fun refreshToken(@Header("Authorization") token: String): BaseResponse<TokenResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class TokenResponse(
@SerialName("accessToken")
val accessToken: String,
val accessToken: String? = null,
@SerialName("refreshToken")
val refreshToken: String,
val refreshToken: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.hmh.hamyeonham.core.network.auth.authenticator
import android.content.Context
import android.util.Log
import com.hmh.hamyeonham.common.navigation.NavigationProvider
import com.hmh.hamyeonham.core.network.auth.api.RefreshApi
import com.hmh.hamyeonham.core.network.auth.api.RefreshService
import com.hmh.hamyeonham.core.network.auth.datastore.HMHNetworkPreference
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking
Expand All @@ -17,7 +17,7 @@ import javax.inject.Singleton
@Singleton
class HMHAuthenticator @Inject constructor(
private val dataStore: HMHNetworkPreference,
private val api: RefreshApi,
private val api: RefreshService,
@ApplicationContext private val context: Context,
private val navigationProvider: NavigationProvider
) : Authenticator {
Expand All @@ -33,8 +33,9 @@ class HMHAuthenticator @Inject constructor(
api.refreshToken("Bearer $refreshToken")
}
}.onSuccess {
dataStore.refreshToken = it.refreshToken
dataStore.accessToken = it.accessToken
val data = it.data
dataStore.refreshToken = data.refreshToken.orEmpty()
dataStore.accessToken = data.accessToken.orEmpty()
}.onFailure {
Log.e("Authenticator", it.toString())
runBlocking {
Expand All @@ -48,7 +49,7 @@ class HMHAuthenticator @Inject constructor(
}.getOrThrow()

return response.request.newBuilder()
.header("Authorization", "Bearer ${newTokens.accessToken}")
.header("Authorization", "Bearer ${newTokens.data.accessToken}")
.build()
}
return null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.hmh.hamyeonham.core.network.auth.interceptor

import com.hmh.hamyeonham.core.network.auth.datastore.HMHNetworkPreference
import okhttp3.Headers
import okhttp3.Interceptor
import okhttp3.Response
import javax.inject.Inject
Expand All @@ -17,13 +18,14 @@ class AuthInterceptor @Inject constructor(
return chain.proceed(originalRequest)
}
val headerRequest = originalRequest.newBuilder()
.header("Authorization", encodedToken)
.addHeader("Authorization", encodedToken)
.addHeader("OS", "Android")
.build()
return chain.proceed(headerRequest)
}

private fun shouldRequestAuthenticatedHeaders(encodedPath: String) = when (encodedPath) {
"/api/v1/auth" -> false
"/api/v1/user/reissue" -> false
else -> true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.hmh.hamyeonham.core.network.di

import android.content.Context
import android.content.SharedPreferences
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
import com.hmh.hamyeonham.core.network.BuildConfig
import com.hmh.hamyeonham.core.network.auth.datastore.DefaultHMHNetworkPreference
import com.hmh.hamyeonham.core.network.auth.datastore.HMHNetworkPreference
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import java.security.GeneralSecurityException
import java.security.KeyStore
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object DataStoreModule {
private const val DEBUG_APP_PREFERNCES_NAME = "hmh_debug"
private const val APP_PREFERENCES_NAME = "hmh"

@Provides
@Singleton
fun provideAppPreferences(
@ApplicationContext context: Context
): SharedPreferences = if (BuildConfig.DEBUG) {
context.getSharedPreferences(DEBUG_APP_PREFERNCES_NAME, Context.MODE_PRIVATE)
} else {
try {
createEncryptedSharedPreferences(APP_PREFERENCES_NAME, context)
} catch (e: GeneralSecurityException) {
deleteMasterKeyEntry()
deleteExistingPref(APP_PREFERENCES_NAME, context)
createEncryptedSharedPreferences(APP_PREFERENCES_NAME, context)
}
}

private fun deleteExistingPref(fileName: String, context: Context) {
context.deleteSharedPreferences(fileName)
}

private fun deleteMasterKeyEntry() {
KeyStore.getInstance("AndroidKeyStore").apply {
load(null)
deleteEntry(MasterKey.DEFAULT_MASTER_KEY_ALIAS)
}
}

private fun createEncryptedSharedPreferences(
fileName: String,
context: Context
): SharedPreferences {
return EncryptedSharedPreferences.create(
context,
fileName,
MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build(),
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

)
}

@Module
@InstallIn(SingletonComponent::class)
interface Binder {
@Singleton
@Binds
fun bindAppPreferences(dataStore: DefaultHMHNetworkPreference): HMHNetworkPreference
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.hmh.hamyeonham.core.network.di

import com.hmh.hamyeonham.common.qualifier.Unsecured
import com.hmh.hamyeonham.core.network.auth.api.RefreshService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.create
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object RefreshModule {
@Provides
@Singleton
fun provideRefreshApi(@Unsecured retrofit: Retrofit): RefreshService = retrofit.create()
}

0 comments on commit ac37bb9

Please sign in to comment.