AccessToken Interceptor로 Header에 token담아주기

undefined·2023년 1월 23일
0

Android

목록 보기
1/3

이번 작업을 하면서 기존에 짜여져 있던 스켈레톤 코드에는 토큰을 Retrofit Service객체에서 @Header를 붙여서 보내는 방식을 사용하고 있었다.

    suspend fun autoLogin(@Header("Authorization") authorization: String?): Response<AutoLogin>

하지만 회원가입을 제외한 모든 요청에는 token을 헤더에 담아서 요청해야 했기 때문에 매번 어노테이션을 붙여주는것은 불편하다고 생각했다.

그래서 Interceptor를 이용해 모든 요청에 token은 담아서 넘겨주도록 만들었다.
왜인지 응답을 자꾸 html로 받아오길래 content-type도 같이 설정해서 넘겼다.

    class AddedTokenRequest(private val localToken:String):Interceptor{
        override fun intercept(chain: Interceptor.Chain): Response {

            val tokenRequest = chain.request().newBuilder().addHeader("Authorization",localToken).addHeader("Content-Type","application/json").build()

            return chain.proceed(tokenRequest)
        }
    }

그리고 이렇게 만든 인터셉터를 클라이언트 객체에 붙여준다.

fun getClient(baseUrl: String): Retrofit {

        if(retrofit == null) {
            val interceptor = HttpLoggingInterceptor()
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)

            okhttp = OkHttpClient.Builder()
                .connectTimeout(15000, TimeUnit.MILLISECONDS)
                .readTimeout(15000, TimeUnit.MILLISECONDS)
                .writeTimeout(15000, TimeUnit.MILLISECONDS)
                .addNetworkInterceptor(**interceptor**)
                .addInterceptor(addedTokenInterceptor)
                .build()

            retrofit = Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okhttp)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build()
        }
        return retrofit!!
    }

이 객체는 koin모듈에서 만들기엔 좀 지저분해서 따로 파일을 생성했다.

처음에 있던 코드에서는 init{}에서 한번 선언하고 이후에 이 객체 가져올 때 getClient()로 또 만들어서 가져오던데 왜인지는 잘 모르겠다...

profile
이것저것 하고 싶은 게 많은 병아리 개발자

0개의 댓글