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' extName = 'Kamyroll'
pkgNameSuffix = 'all.kamyroll' pkgNameSuffix = 'all.kamyroll'
extClass = '.Kamyroll' extClass = '.Kamyroll'
extVersionCode = 5 extVersionCode = 6
libVersion = '13' libVersion = '13'
} }

View File

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