Browse Source

Added cookie storage as alternative way for storing auth data

Vadik Sirekanyan 7 years ago
parent
commit
791e04a5cf

+ 4 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency/app.kt

@@ -17,6 +17,8 @@ import com.sirekanyan.knigopis.repository.*
 import com.sirekanyan.knigopis.repository.cache.CommonCache
 import com.sirekanyan.knigopis.repository.cache.CommonCache
 import com.sirekanyan.knigopis.repository.cache.CommonCacheImpl
 import com.sirekanyan.knigopis.repository.cache.CommonCacheImpl
 import com.sirekanyan.knigopis.repository.cache.HeadedModelDeserializer
 import com.sirekanyan.knigopis.repository.cache.HeadedModelDeserializer
+import com.sirekanyan.knigopis.repository.network.AuthInterceptor
+import com.sirekanyan.knigopis.repository.network.CookieStorage
 import okhttp3.OkHttpClient
 import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
 import okhttp3.logging.HttpLoggingInterceptor
 import retrofit2.Retrofit
 import retrofit2.Retrofit
@@ -57,6 +59,8 @@ fun App.provideEndpoint(): Endpoint =
         .addConverterFactory(GsonConverterFactory.create(gson))
         .addConverterFactory(GsonConverterFactory.create(gson))
         .client(
         .client(
             OkHttpClient.Builder()
             OkHttpClient.Builder()
+                .cookieJar(CookieStorage)
+                .addInterceptor(AuthInterceptor(tokenStorage))
                 .setDebugEnabled(BuildConfig.DEBUG)
                 .setDebugEnabled(BuildConfig.DEBUG)
                 .build()
                 .build()
         )
         )

+ 31 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/network/AuthInterceptor.kt

@@ -0,0 +1,31 @@
+package com.sirekanyan.knigopis.repository.network
+
+import com.sirekanyan.knigopis.repository.TokenStorage
+import okhttp3.Interceptor
+import okhttp3.Interceptor.Chain
+import okhttp3.Response
+
+private const val UNAUTHORIZED_HTTP_CODE = 401
+private const val ACCESS_TOKEN_PARAMETER_NAME = "access-token"
+
+class AuthInterceptor(private val storage: TokenStorage) : Interceptor {
+
+    override fun intercept(chain: Chain): Response {
+        val request = chain.request()
+        val response = chain.proceed(request)
+        if (response.code() == UNAUTHORIZED_HTTP_CODE) {
+            storage.accessToken?.let { accessToken ->
+                val urlWithAccessToken = request.url().newBuilder()
+                    .addQueryParameter(ACCESS_TOKEN_PARAMETER_NAME, accessToken)
+                    .build()
+                return chain.proceed(
+                    request.newBuilder()
+                        .url(urlWithAccessToken)
+                        .build()
+                )
+            }
+        }
+        return response
+    }
+
+}

+ 20 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/network/CookieStorage.kt

@@ -0,0 +1,20 @@
+package com.sirekanyan.knigopis.repository.network
+
+import okhttp3.Cookie
+import okhttp3.CookieJar
+import okhttp3.HttpUrl
+import java.util.concurrent.atomic.AtomicReference
+
+object CookieStorage : CookieJar {
+
+    private val cookies = AtomicReference<List<Cookie>>()
+
+    override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
+        this.cookies.set(cookies)
+    }
+
+    override fun loadForRequest(url: HttpUrl): List<Cookie> {
+        return cookies.get() ?: listOf()
+    }
+
+}