From 3c4c537078c2d7cc7daa29d2b3e2fc97b7ee321a Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 2 Jul 2024 02:54:58 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[fix]:=20refresh=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EB=A7=8C=EB=A3=8C=20=EC=8B=9C=20code=20=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sample/network/SPAuthenticator.kt | 91 ++++++++++++------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/core/network/src/main/java/com/sample/network/SPAuthenticator.kt b/core/network/src/main/java/com/sample/network/SPAuthenticator.kt index 771ab2f..224c7b2 100644 --- a/core/network/src/main/java/com/sample/network/SPAuthenticator.kt +++ b/core/network/src/main/java/com/sample/network/SPAuthenticator.kt @@ -12,47 +12,72 @@ import okhttp3.Authenticator import okhttp3.Request import okhttp3.Response import okhttp3.Route +import org.json.JSONException +import org.json.JSONObject import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @Singleton -class SPAuthenticator @Inject constructor( - private val dataStore: NetworkPreference, - private val api: AuthService, - @ApplicationContext private val context: Context, - private val navigationProvider: NavigationProvider, -) : Authenticator { - override fun authenticate(route: Route?, response: Response): Request? { - // if (response.request.header("Authorization") == null) { - // return null - // } +class SPAuthenticator + @Inject + constructor( + private val dataStore: NetworkPreference, + private val api: AuthService, + @ApplicationContext private val context: Context, + private val navigationProvider: NavigationProvider, + ) : Authenticator { + override fun authenticate( + route: Route?, + response: Response, + ): Request? { + if (response.request.header("Authorization") == null) { + return null + } - if (response.code == 401) { - val refreshToken = dataStore.refreshToken - val newTokens = runCatching { - runBlocking { - api.refreshToken(refreshToken) + val responseBody = response.peekBody(Long.MAX_VALUE).string() + val isAuthError = + try { + val jsonObject = JSONObject(responseBody) + jsonObject.getString("code") == "AUTH4001" + } catch (e: JSONException) { + false } - }.onSuccess { - val data = it.data - dataStore.refreshToken = data.refreshToken.orEmpty() - dataStore.accessToken = data.accessToken.orEmpty() - }.onFailure { - Timber.e("Authenticator", it.toString()) - runBlocking { - dataStore.clear() - UserApiClient.instance.logout { error -> - Timber.e("Authenticator", error.toString()) - ProcessPhoenix.triggerRebirth(context, navigationProvider.toLogin()) + + if (isAuthError) { + return handleTokenRefresh(response) + } + + return null + } + + private fun handleTokenRefresh(response: Response): Request? { + val refreshToken = dataStore.refreshToken + val newTokens = + runCatching { + runBlocking { + api.refreshToken(refreshToken) } - } - }.getOrThrow() + }.onSuccess { + val data = it.data + dataStore.refreshToken = data.refreshToken.orEmpty() + dataStore.accessToken = data.accessToken.orEmpty() + }.onFailure { + Timber.e("Authenticator", it.toString()) + runBlocking { + dataStore.clear() + UserApiClient.instance.logout { error -> + Timber.e("Authenticator", error.toString()) + ProcessPhoenix.triggerRebirth(context, navigationProvider.toLogin()) + } + } + }.getOrThrow() - return response.request.newBuilder() - // .header("Authorization", newTokens.data.accessToken) - .build() + return newTokens.data.accessToken?.let { + response.request + .newBuilder() + .header("Authorization", "Bearer $it") + .build() + } } - return null } -} From 4543904a3c631956d7357d39b2bed73cd576e5fe Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 2 Jul 2024 03:10:15 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[feat]:=20=EC=9E=90=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/zucchini/auth/LoginActivity.kt | 9 +++++++++ .../src/main/java/com/zucchini/auth/LoginViewModel.kt | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt b/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt index 3d8e756..90b90e9 100644 --- a/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt @@ -36,6 +36,7 @@ class LoginActivity @Inject constructor( super.onCreate(savedInstanceState) setContentView(binding.root) + autoLogin() kakaoLogin() collectKakaoLogin() setLoginViewPager() @@ -61,6 +62,14 @@ class LoginActivity @Inject constructor( }.launchIn(lifecycleScope) } + private fun autoLogin() { + if (viewModel.autoLoginConfigured.value) { + navigateToMain() + } else { + Timber.d("Auto Login Configured False") + } + } + private fun navigateToMain() { intent = Intent(this, MainActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) diff --git a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt index 75c4688..1871d71 100644 --- a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt +++ b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt @@ -27,8 +27,11 @@ class LoginViewModel @Inject constructor( private val _isLogin = MutableStateFlow(false) val isLogin = _isLogin.asStateFlow() + private val _autoLoginConfigured = MutableStateFlow(networkPreference.autoLoginConfigured) + val autoLoginConfigured = _autoLoginConfigured.asStateFlow() + init { - //getKakaoUserInfo() + _autoLoginConfigured.value = networkPreference.autoLoginConfigured } fun loginWithKakaoApp(context: Context) {