From 0f71bba0be26d8004c3d6b1eb6b194fe4a6c9937 Mon Sep 17 00:00:00 2001 From: Parkseojin Date: Sun, 26 Nov 2023 00:59:46 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[remove]=20:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C=20#534?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../umc/yourweather/di/TokenAuthenticator.kt | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 app/src/main/java/com/umc/yourweather/di/TokenAuthenticator.kt diff --git a/app/src/main/java/com/umc/yourweather/di/TokenAuthenticator.kt b/app/src/main/java/com/umc/yourweather/di/TokenAuthenticator.kt deleted file mode 100644 index 39e52b53..00000000 --- a/app/src/main/java/com/umc/yourweather/di/TokenAuthenticator.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.umc.yourweather.di - -import android.util.Log -import okhttp3.Authenticator -import okhttp3.Request -import okhttp3.Response -import okhttp3.Route - -/*class TokenAuthenticator: Authenticator { - override fun authenticate(route: Route?, response: Response): Request? { - Log.i("Authenticator", response.toString()) - Log.i("Authenticator", "토큰 재발급 시도") - return try { - val newAccessToken = RefreshTokenService.refreshToken() - Log.i("Authenticator", "토큰 재발급 성공 : $newAccessToken") - response.request.newBuilder() - .removeHeader("Bearer").apply { - addHeader("Bearer", newAccessToken) - }.build() // 토큰 재발급이 성공했다면, 기존 헤더를 지우고, 새로운 해더를 단다. - } catch (e: Exception) { - e.printStackTrace() - null // 만약 토큰 재발급이 실패했다면 헤더에 아무것도 추가하지 않는다. - } - } -}*/ \ No newline at end of file From 8da0d99d21607cb43afbb86706a534c7277fbb98 Mon Sep 17 00:00:00 2001 From: Parkseojin Date: Sun, 26 Nov 2023 01:15:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[refactor]=20:=20App=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20#534?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/umc/yourweather/di/App.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/umc/yourweather/di/App.kt b/app/src/main/java/com/umc/yourweather/di/App.kt index 03315135..397056bc 100644 --- a/app/src/main/java/com/umc/yourweather/di/App.kt +++ b/app/src/main/java/com/umc/yourweather/di/App.kt @@ -8,7 +8,7 @@ import com.umc.yourweather.BuildConfig class App : Application() { companion object { - var appContext: Context? = null + lateinit var appContext: Context lateinit var token_prefs: TokenSharedPreferences lateinit var globalNickname: String } From ec901492aafaa059dcd91f2ee43dc8b26b857954 Mon Sep 17 00:00:00 2001 From: Parkseojin Date: Sun, 26 Nov 2023 01:16:23 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[refactor]=20:=20Token=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95(Test=EC=A0=84)=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=20=EC=8B=A4=ED=8C=A8=EC=8B=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=8C=EC=95=84=EA=B0=80=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#534?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/umc/yourweather/di/RetrofitImpl.kt | 87 ++++++++++++------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt b/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt index bf7bf96b..e2a2cd93 100644 --- a/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt +++ b/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt @@ -1,11 +1,17 @@ package com.umc.yourweather.di +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.os.Looper import android.util.Log +import android.widget.Toast import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.umc.yourweather.BuildConfig import com.umc.yourweather.data.remote.response.BaseResponse import com.umc.yourweather.data.remote.response.TokenResponse +import com.umc.yourweather.presentation.sign.SignInActivity import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request @@ -35,7 +41,7 @@ object RetrofitImpl { .setLevel(HttpLoggingInterceptor.Level.BODY) OkHttpClient.Builder() .addInterceptor(httpLoggingInterceptor) - .addInterceptor(AuthenticatedInterceptor()) + .addInterceptor(AuthenticatedInterceptor(App.appContext)) .build() } @@ -71,7 +77,7 @@ object RetrofitImpl { } // 토큰이 필요한 요청에 사용할 인터셉터 - class AuthenticatedInterceptor : Interceptor { + class AuthenticatedInterceptor(val context: Context) : Interceptor { @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response = with(chain) { val accessHeader = "Authorization" @@ -79,47 +85,68 @@ object RetrofitImpl { var infoRequest = createRequestBuilder(request(), accessHeader, App.token_prefs.accessToken) - var infoResponse = proceed(infoRequest) -// // 리프래시 test용 -// var infoRequest = -// createRequestBuilder(request(), accessHeader, "aa") -// var infoResponse = proceed(infoRequest) + var infoResponse = proceed(infoRequest) Log.d("저장된 토큰 확인", "저장 토큰 확인 액세스 ${App.token_prefs.accessToken}") Log.d("저장된 토큰 확인", "저장 토큰 확인 리프래시 ${App.token_prefs.refreshToken}") - Log.d("토큰 인터셉터 확인... 첫번째", "${infoResponse.body}") + Log.d("토큰 인터셉터 확인", "첫번재 요청 리턴 코드 ${infoResponse.code}") // 여기서 오류가 나지 않는다면 그냥 response가 리턴 - if (infoResponse.code == 400) { + if (infoResponse.code == 401 or 403) { infoResponse.close() + Log.d("토큰 인터셉터 확인", "두번째... 리프래시 붙여서 토큰 갱신하기 시도") // 유효하지 않으면 기존 리프래시 붙여서 다시 시도 - infoRequest = createRequestBuilder(request(), refreshHeader, App.token_prefs.refreshToken) + infoRequest = + createRequestBuilder(request(), refreshHeader, App.token_prefs.refreshToken) infoResponse = proceed(infoRequest) - - // 리프래시 붙여서 보낸 요청 값... 잘 왔으면 온 요청 다시 tokenPre에 저장하기.... - // 저장하고 다시 요청 - var refreshResponseObject = parseTokenResponse(infoResponse) - Log.d("토큰 인터셉터 확인... 두번째... 리프래시 받아오기 시도", "$refreshResponseObject") - if (refreshResponseObject?.code != 400) { - infoResponse.close() - - Log.d("토큰 인터셉터 확인... 두번째... 리프래시 받아오기 시도성공!", "$refreshResponseObject") - // 여기서 오류난다면(리프래시도 썩었으면 ) 리프래시 얻어온게 실패한 response가 돌아간다 - // 성공하면 다시 토큰 받아온것이므로 그거 다시 저장해주기... - App.token_prefs.accessToken = refreshResponseObject?.result?.accessToken - App.token_prefs.refreshToken = refreshResponseObject?.result?.refreshToken - - // 다시 받아온 토큰으로 요청하기~ - infoRequest = createRequestBuilder(request(), accessHeader, App.token_prefs.accessToken) - return proceed(infoRequest) - // Log.d("토큰 인터셉터 확인... 갱신된 토큰으로 재요청", "$infoRequest") + Log.d("토큰 인터셉터 확인", "두번재 요청 리턴 코드 ${infoResponse.code}") + +// var refreshResponseObject = parseTokenResponse(infoResponse) + if (infoResponse.code != 401 and 403) { + Log.d("토큰 인터셉터 확인", "리프래시 받아오기 시도성공!") + + val newAccessToken = infoResponse.header(accessHeader, null) ?: null + val newRefreshToken = infoResponse.header(refreshHeader, null) ?: null +// infoResponse.close() + + // 받은 토큰이 null이 아니라면 토큰 저장하고 다시 헤더에 붙여서 재요청함. + if (newAccessToken != null && newRefreshToken != null) { + Log.d("토큰 인터셉터 확인", "새 토큰으로 다시 요청") + App.token_prefs.accessToken = newAccessToken + App.token_prefs.refreshToken = newRefreshToken + val newRequest = createRequestBuilder( + request(), + accessHeader, + App.token_prefs.accessToken, + ) + val newResponse = proceed(newRequest) + Log.d("토큰 인터셉터 확인", "세번째 요청 리턴 코드 ${newResponse.code}") + + if (newResponse.code == 401 or 403) { + Log.d("토큰 인터셉터 확인", "재요청 실패. 토큰 오류입니다.") + UserSharedPreferences.clearUser(context) // 로그아웃 + App.token_prefs.clearTokens() // 토큰 제거 + Handler(Looper.getMainLooper()).post { + Toast.makeText( + context, + "비정상적인 요청 발생. 다시 로그인해주세요! ", + Toast.LENGTH_SHORT, + ).show() + val intent = + Intent(context, SignInActivity::class.java) // 로그인 화면으로 이동 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + context.startActivity(intent) + } + } else { + return newResponse + } + } + Log.d("토큰 인터셉터 확인", "토큰 요청으로 받은 토큰이 null입니다.") } } infoResponse - // 리프래시 오면 다시 시도 - // Log.d("토큰 인터셉터 확인... 최종 response", "${infoResponse.body}") } } From 276539540bda1c1c9be23c5a16ad0dfbd1af0324 Mon Sep 17 00:00:00 2001 From: Parkseojin Date: Sun, 26 Nov 2023 03:08:49 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[refactor]=20:=20Token=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=97=90=20=EA=B0=B1=EC=8B=A0=20=ED=86=A0=ED=81=B0=20null=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#534?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/umc/yourweather/di/RetrofitImpl.kt | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt b/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt index e2a2cd93..3a11e3ab 100644 --- a/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt +++ b/app/src/main/java/com/umc/yourweather/di/RetrofitImpl.kt @@ -1,17 +1,12 @@ package com.umc.yourweather.di import android.content.Context -import android.content.Intent -import android.os.Handler -import android.os.Looper import android.util.Log -import android.widget.Toast import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.umc.yourweather.BuildConfig import com.umc.yourweather.data.remote.response.BaseResponse import com.umc.yourweather.data.remote.response.TokenResponse -import com.umc.yourweather.presentation.sign.SignInActivity import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request @@ -93,7 +88,7 @@ object RetrofitImpl { Log.d("토큰 인터셉터 확인", "첫번재 요청 리턴 코드 ${infoResponse.code}") // 여기서 오류가 나지 않는다면 그냥 response가 리턴 - if (infoResponse.code == 401 or 403) { + if (infoResponse.code == 400) { infoResponse.close() Log.d("토큰 인터셉터 확인", "두번째... 리프래시 붙여서 토큰 갱신하기 시도") @@ -103,14 +98,21 @@ object RetrofitImpl { infoResponse = proceed(infoRequest) Log.d("토큰 인터셉터 확인", "두번재 요청 리턴 코드 ${infoResponse.code}") -// var refreshResponseObject = parseTokenResponse(infoResponse) - if (infoResponse.code != 401 and 403) { - Log.d("토큰 인터셉터 확인", "리프래시 받아오기 시도성공!") + var refreshResponseObject = parseTokenResponse(infoResponse) + Log.d("토큰 인터셉터 확인", "두번재 요청 리턴 코드 파싱된것으로 확인하기${ refreshResponseObject?.code}") - val newAccessToken = infoResponse.header(accessHeader, null) ?: null - val newRefreshToken = infoResponse.header(refreshHeader, null) ?: null + if (refreshResponseObject?.code != 400) { + Log.d("토큰 인터셉터 확인", "토큰 갱신 시도성공!") + + val newAccessToken = refreshResponseObject?.result?.accessToken + val newRefreshToken = refreshResponseObject?.result?.refreshToken // infoResponse.close() + Log.d("토큰 인터셉터 확인", "갱신 요청. 응답 확인. 파싱된값 $refreshResponseObject?") + Log.d("토큰 인터셉터 확인", "갱신 요청. 응답 확인. ${infoResponse.body}") + Log.d("토큰 인터셉터 확인", "갱신 요청. 토큰 확인. 액세스 $newAccessToken") + Log.d("토큰 인터셉터 확인", "갱신 요청. 토큰 확인. 리프래시 $newRefreshToken") + // 받은 토큰이 null이 아니라면 토큰 저장하고 다시 헤더에 붙여서 재요청함. if (newAccessToken != null && newRefreshToken != null) { Log.d("토큰 인터셉터 확인", "새 토큰으로 다시 요청") @@ -124,24 +126,25 @@ object RetrofitImpl { val newResponse = proceed(newRequest) Log.d("토큰 인터셉터 확인", "세번째 요청 리턴 코드 ${newResponse.code}") - if (newResponse.code == 401 or 403) { - Log.d("토큰 인터셉터 확인", "재요청 실패. 토큰 오류입니다.") - UserSharedPreferences.clearUser(context) // 로그아웃 - App.token_prefs.clearTokens() // 토큰 제거 - Handler(Looper.getMainLooper()).post { - Toast.makeText( - context, - "비정상적인 요청 발생. 다시 로그인해주세요! ", - Toast.LENGTH_SHORT, - ).show() - val intent = - Intent(context, SignInActivity::class.java) // 로그인 화면으로 이동 - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - context.startActivity(intent) - } - } else { - return newResponse - } + return newResponse +// if (newResponse.code == 400) { +// Log.d("토큰 인터셉터 확인", "재요청 실패. 토큰 오류입니다.") +// UserSharedPreferences.clearUser(context) // 로그아웃 +// App.token_prefs.clearTokens() // 토큰 제거 +// Handler(Looper.getMainLooper()).post { +// Toast.makeText( +// context, +// "다시 로그인해주세요! ", +// Toast.LENGTH_SHORT, +// ).show() +// val intent = +// Intent(context, SignInActivity::class.java) // 로그인 화면으로 이동 +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) +// context.startActivity(intent) +// } +// } else { +// return newResponse +// } } Log.d("토큰 인터셉터 확인", "토큰 요청으로 받은 토큰이 null입니다.") }