Kamyroll: Fix token request (#1151)

Use token for kamyroll requests only
Use original chain request when new token is fetched
This commit is contained in:
Samfun75
2023-01-10 13:06:21 +03:00
committed by GitHub
parent aec31b2889
commit 674db668f4
2 changed files with 22 additions and 18 deletions

View File

@ -6,7 +6,7 @@ ext {
extName = 'Kamyroll'
pkgNameSuffix = 'all.kamyroll'
extClass = '.Kamyroll'
extVersionCode = 5
extVersionCode = 6
libVersion = '13'
}

View File

@ -1,10 +1,10 @@
package eu.kanade.tachiyomi.animeextension.all.kamyroll
import android.content.SharedPreferences
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.GET
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
@ -13,12 +13,18 @@ import java.net.HttpURLConnection
class AccessTokenInterceptor(val baseUrl: String, val json: Json, val preferences: SharedPreferences) : Interceptor {
private val deviceId = randomId()
private var accessToken = preferences.getString("access_token", null) ?: ""
override fun intercept(chain: Interceptor.Chain): Response {
val accessToken = getAccessToken()
val request = chain.request().newBuilder()
.header("authorization", accessToken)
.build()
if (accessToken.isBlank()) accessToken = refreshAccessToken()
val request = if (chain.request().url.toString().contains("kamyroll")) {
chain.request().newBuilder()
.header("authorization", accessToken)
.build()
} else {
chain.request()
}
val response = chain.proceed(request)
if (response.code == HttpURLConnection.HTTP_UNAUTHORIZED) {
@ -27,13 +33,15 @@ class AccessTokenInterceptor(val baseUrl: String, val json: Json, val preference
val newAccessToken = refreshAccessToken()
// Access token is refreshed in another thread.
if (accessToken != newAccessToken) {
return chain.proceed(newRequestWithAccessToken(request, newAccessToken))
accessToken = newAccessToken
return chain.proceed(newRequestWithAccessToken(chain.request(), newAccessToken))
}
// Need to refresh an access token
val updatedAccessToken = refreshAccessToken()
accessToken = updatedAccessToken
// Retry the request
return chain.proceed(newRequestWithAccessToken(request, updatedAccessToken))
return chain.proceed(newRequestWithAccessToken(chain.request(), updatedAccessToken))
}
}
@ -46,18 +54,14 @@ class AccessTokenInterceptor(val baseUrl: String, val json: Json, val preference
.build()
}
private fun getAccessToken(): String {
return preferences.getString("access_token", null) ?: ""
}
private fun refreshAccessToken(): String {
val client = OkHttpClient().newBuilder().build()
val formData = FormBody.Builder()
.add("device_id", deviceId)
.add("device_type", "aniyomi")
.add("access_token", "HMbQeThWmZq4t7w")
val url = "$baseUrl/auth/v1/token".toHttpUrlOrNull()!!.newBuilder()
.addQueryParameter("device_id", deviceId)
.addQueryParameter("device_type", "aniyomi")
.addQueryParameter("access_token", "HMbQeThWmZq4t7w")
.build()
val response = client.newCall(POST(url = "$baseUrl/auth/v1/token", body = formData)).execute()
val response = client.newCall(GET(url.toString())).execute()
val parsedJson = json.decodeFromString<AccessToken>(response.body!!.string())
val token = "${parsedJson.token_type} ${parsedJson.access_token}"
preferences.edit().putString("access_token", token).apply()