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:
@ -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'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user