Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 응답 코드가 401이면 로그인 화면으로 이동하는 기능 구현 #831

Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,25 +1,47 @@
package com.emmsale.data.common.retrofit

import android.content.Context
import android.content.Intent
import com.emmsale.data.repository.interfaces.TokenRepository
import com.emmsale.presentation.ui.login.LoginActivity
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response

class AuthInterceptor(context: Context) : Interceptor {
class AuthInterceptor(private val context: Context) : Interceptor {
private val tokenRepository = EntryPointAccessors
.fromApplication<AuthInterceptorEntryPoint>(context)
.getTokenRepository()

override fun intercept(chain: Interceptor.Chain): Response {
val token = tokenRepository.getToken()
val newRequest = chain.request().newBuilder()
.addHeader(ACCESS_TOKEN_HEADER, ACCESS_TOKEN_FORMAT.format(token?.accessToken))
.build()
return chain.proceed(newRequest)
val tokenAddedRequest = chain.request().putAccessToken(token?.accessToken)

val response = chain.proceed(tokenAddedRequest)
if (response.isAccessTokenExpired()) {
navigateToLogin()
}
return response
}

private fun Response.isAccessTokenExpired(): Boolean = (code == 401)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

401 코드의 의미는 정확히 access token이 만료되었을 때를 의미하는 것이 아니라 비인증을 나타낼 때 쓰이는 것이므로 401을 적절한 이름을 사용하여 상수화하면 어떨까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비인증인 상황은 토큰이 만료된 경우, 유효하지 않은 경우가 있겠군요.
조금 더 추상적으로 isAccessTokenInvalid() 로 작성하면 두 의미를 모두 포함할 수 있겠네요.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 토큰이 아니라 쿠키 혹은 세션으로 인증하는 방식이라면 비인증이 토큰이 유효하지 않은 경우와 일치하지 않는다고 생각합니다. 하지만 저희 앱은 토큰만 사용하기로 했으니 isAccessTokenInvalid()가 괜찮을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

커디 앱에서는 JWT를 사용하고 있는데, 세션이라는 개념이 필요할까요..?
JWT를 사용한다면 401이 되는 상황은 크게 위에 말씀드린 두 가지 경우일 것이라고 생각이 드네요~

세션을 사용하지 않는데 메서드명에 Session까지 고려한 이름을 사용할 필요는 없다고 생각합니다.


private fun Request.putAccessToken(token: String?): Request =
putHeader(ACCESS_TOKEN_HEADER, ACCESS_TOKEN_FORMAT.format(token))

private fun Request.putHeader(
key: String,
value: String,
): Request = newBuilder().addHeader(key, value).build()

private fun navigateToLogin() {
val loginStartIntent = Intent(context, LoginActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(loginStartIntent)
}

@EntryPoint
Expand Down