mirror of
https://github.com/mihonapp/mihon.git
synced 2025-01-28 19:04:55 +01:00
feat: changed authorization principle, removed dependence on third-party server
This commit is contained in:
parent
f480d4cb38
commit
e44666673f
@ -128,9 +128,9 @@ class Hikka(id: Long) : BaseTracker(id, "Hikka"), DeletableTracker {
|
|||||||
|
|
||||||
override suspend fun login(username: String, password: String) = login(password)
|
override suspend fun login(username: String, password: String) = login(password)
|
||||||
|
|
||||||
suspend fun login(code: String) {
|
suspend fun login(reference: String) {
|
||||||
try {
|
try {
|
||||||
val oauth = api.accessToken(code)
|
val oauth = api.accessToken(reference)
|
||||||
interceptor.setAuth(oauth)
|
interceptor.setAuth(oauth)
|
||||||
val user = api.getCurrentUser()
|
val user = api.getCurrentUser()
|
||||||
saveCredentials(user.reference, oauth.accessToken)
|
saveCredentials(user.reference, oauth.accessToken)
|
||||||
|
@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.data.track.hikka
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import eu.kanade.tachiyomi.data.database.models.Track
|
import eu.kanade.tachiyomi.data.database.models.Track
|
||||||
import eu.kanade.tachiyomi.data.track.hikka.dto.HKAuthTokenInfo
|
|
||||||
import eu.kanade.tachiyomi.data.track.hikka.dto.HKManga
|
import eu.kanade.tachiyomi.data.track.hikka.dto.HKManga
|
||||||
import eu.kanade.tachiyomi.data.track.hikka.dto.HKMangaPagination
|
import eu.kanade.tachiyomi.data.track.hikka.dto.HKMangaPagination
|
||||||
import eu.kanade.tachiyomi.data.track.hikka.dto.HKOAuth
|
import eu.kanade.tachiyomi.data.track.hikka.dto.HKOAuth
|
||||||
@ -48,24 +47,16 @@ class HikkaApi(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun getTokenInfo(accessToken: String): HKAuthTokenInfo {
|
suspend fun accessToken(reference: String): HKOAuth {
|
||||||
return withIOContext {
|
return withIOContext {
|
||||||
with(json) {
|
with(json) {
|
||||||
client.newCall(authTokenInfo(accessToken))
|
client.newCall(authTokenCreate(reference))
|
||||||
.awaitSuccess()
|
.awaitSuccess()
|
||||||
.parseAs<HKAuthTokenInfo>()
|
.parseAs<HKOAuth>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun accessToken(code: String): HKOAuth {
|
|
||||||
return withIOContext {
|
|
||||||
val tokenInfo = getTokenInfo(code)
|
|
||||||
val oauth = HKOAuth(code, tokenInfo.expiration)
|
|
||||||
oauth
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun searchManga(query: String): List<TrackSearch> {
|
suspend fun searchManga(query: String): List<TrackSearch> {
|
||||||
return withIOContext {
|
return withIOContext {
|
||||||
val url = "$BASE_API_URL/manga".toUri().buildUpon()
|
val url = "$BASE_API_URL/manga".toUri().buildUpon()
|
||||||
@ -189,10 +180,13 @@ class HikkaApi(
|
|||||||
const val BASE_API_URL = "https://hikka.io/api"
|
const val BASE_API_URL = "https://hikka.io/api"
|
||||||
const val BASE_URL = "https://hikka.io"
|
const val BASE_URL = "https://hikka.io"
|
||||||
private const val SCOPE = "readlist,read:user-details"
|
private const val SCOPE = "readlist,read:user-details"
|
||||||
private const val REFERENCE = "49eda83d-baa6-45f8-9936-b2a41d944da4"
|
private const val CLIENT_REFERENCE = "49eda83d-baa6-45f8-9936-b2a41d944da4"
|
||||||
|
private const val CLIENT_SECRET = "8Zxzs13Pvikx6m_4rwjF7t2BxxnEb0wWtXIRQ_68HyCvmdhGE9hdfz" +
|
||||||
|
"SL1Pas4h927LaV2ocjVoc--S_vmorHEWWh42Z_z70j-wSFYsraQQ98" +
|
||||||
|
"hiOeTH2BaDf77ZcA9W5Z"
|
||||||
|
|
||||||
fun authUrl(): Uri = "$BASE_URL/oauth".toUri().buildUpon()
|
fun authUrl(): Uri = "$BASE_URL/oauth".toUri().buildUpon()
|
||||||
.appendQueryParameter("reference", REFERENCE)
|
.appendQueryParameter("reference", CLIENT_REFERENCE)
|
||||||
.appendQueryParameter("scope", SCOPE)
|
.appendQueryParameter("scope", SCOPE)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
@ -204,6 +198,14 @@ class HikkaApi(
|
|||||||
return GET("$BASE_API_URL/user/me", headers = headers) // Any request with auth
|
return GET("$BASE_API_URL/user/me", headers = headers) // Any request with auth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun authTokenCreate(reference: String): Request {
|
||||||
|
val payload = buildJsonObject {
|
||||||
|
put("request_reference", reference)
|
||||||
|
put("client_secret", CLIENT_SECRET)
|
||||||
|
}
|
||||||
|
return POST("$BASE_API_URL/auth/token", body = payload.toString().toRequestBody(jsonMime))
|
||||||
|
}
|
||||||
|
|
||||||
fun authTokenInfo(accessToken: String): Request {
|
fun authTokenInfo(accessToken: String): Request {
|
||||||
val headers = Headers.Builder()
|
val headers = Headers.Builder()
|
||||||
.add("auth", accessToken)
|
.add("auth", accessToken)
|
||||||
|
@ -30,7 +30,7 @@ class HikkaInterceptor(private val hikka: Hikka) : Interceptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val authTokenInfo = json.decodeFromString<HKAuthTokenInfo>(authTokenInfoResponse.body.string())
|
val authTokenInfo = json.decodeFromString<HKAuthTokenInfo>(authTokenInfoResponse.body.string())
|
||||||
setAuth(HKOAuth(oauth!!.accessToken, authTokenInfo.expiration))
|
setAuth(HKOAuth(oauth!!.accessToken, authTokenInfo.expiration, authTokenInfo.created))
|
||||||
}
|
}
|
||||||
|
|
||||||
val authRequest = originalRequest.newBuilder()
|
val authRequest = originalRequest.newBuilder()
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package eu.kanade.tachiyomi.data.track.hikka.dto
|
package eu.kanade.tachiyomi.data.track.hikka.dto
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class HKOAuth(
|
data class HKOAuth(
|
||||||
val accessToken: String,
|
@SerialName("secret") val accessToken: String,
|
||||||
val expiration: Long,
|
val expiration: Long,
|
||||||
|
val created: Long,
|
||||||
) {
|
) {
|
||||||
fun isExpired(): Boolean {
|
fun isExpired(): Boolean {
|
||||||
return (expiration - 43200) < (System.currentTimeMillis() / 1000)
|
return (expiration - 43200) < (System.currentTimeMillis() / 1000)
|
||||||
|
@ -70,10 +70,10 @@ class TrackLoginActivity : BaseOAuthLoginActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleHikka(data: Uri) {
|
private fun handleHikka(data: Uri) {
|
||||||
val code = data.getQueryParameter("code")
|
val reference = data.getQueryParameter("reference")
|
||||||
if (code != null) {
|
if (reference != null) {
|
||||||
lifecycleScope.launchIO {
|
lifecycleScope.launchIO {
|
||||||
trackerManager.hikka.login(code)
|
trackerManager.hikka.login(reference)
|
||||||
returnToSettings()
|
returnToSettings()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user