Skip to content

Commit c26e129

Browse files
committed
fix: Expire token relative to current date time instead of just time
1 parent 84ea5e4 commit c26e129

File tree

5 files changed

+69
-58
lines changed

5 files changed

+69
-58
lines changed

src/main/kotlin/app/revanced/api/configuration/Dependencies.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import app.revanced.api.configuration.repository.GitHubBackendRepository
77
import app.revanced.api.configuration.services.*
88
import app.revanced.api.configuration.services.AnnouncementService
99
import app.revanced.api.configuration.services.ApiService
10-
import app.revanced.api.configuration.services.AuthService
10+
import app.revanced.api.configuration.services.AuthenticationService
1111
import app.revanced.api.configuration.services.OldApiService
1212
import app.revanced.api.configuration.services.PatchesService
1313
import com.akuleshov7.ktoml.Toml
@@ -116,11 +116,11 @@ fun Application.configureDependencies(
116116

117117
val jwtSecret = dotenv["JWT_SECRET"]
118118
val issuer = dotenv["JWT_ISSUER"]
119-
val validityInMin = dotenv["JWT_VALIDITY_IN_MIN"].toInt()
119+
val validityInMin = dotenv["JWT_VALIDITY_IN_MIN"].toLong()
120120

121121
val authSHA256DigestString = dotenv["AUTH_SHA256_DIGEST"]
122122

123-
AuthService(issuer, validityInMin, jwtSecret, authSHA256DigestString)
123+
AuthenticationService(issuer, validityInMin, jwtSecret, authSHA256DigestString)
124124
}
125125
single {
126126
val configuration = get<ConfigurationRepository>()
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package app.revanced.api.configuration
22

3-
import app.revanced.api.configuration.services.AuthService
3+
import app.revanced.api.configuration.services.AuthenticationService
44
import io.ktor.server.application.*
5+
import io.ktor.server.auth.*
56
import org.koin.ktor.ext.get
67

78
fun Application.configureSecurity() {
8-
get<AuthService>().configureSecurity(this)
9+
val authenticationService = get<AuthenticationService>()
10+
11+
install(Authentication) {
12+
with(authenticationService) {
13+
jwt()
14+
digest()
15+
}
16+
}
917
}

src/main/kotlin/app/revanced/api/configuration/routes/ApiRoute.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import app.revanced.api.configuration.schema.APIContributable
1111
import app.revanced.api.configuration.schema.APIMember
1212
import app.revanced.api.configuration.schema.APIRateLimit
1313
import app.revanced.api.configuration.services.ApiService
14-
import app.revanced.api.configuration.services.AuthService
14+
import app.revanced.api.configuration.services.AuthenticationService
1515
import io.bkbn.kompendium.core.metadata.*
1616
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
1717
import io.bkbn.kompendium.oas.payload.Parameter
@@ -21,21 +21,20 @@ import io.ktor.server.auth.*
2121
import io.ktor.server.plugins.ratelimit.*
2222
import io.ktor.server.response.*
2323
import io.ktor.server.routing.*
24-
import kotlinx.serialization.json.Json.Default.configuration
2524
import kotlin.time.Duration.Companion.days
2625
import org.koin.ktor.ext.get as koinGet
2726

2827
internal fun Route.apiRoute() {
2928
val apiService = koinGet<ApiService>()
30-
val authService = koinGet<AuthService>()
29+
val authenticationService = koinGet<AuthenticationService>()
3130

3231
rateLimit(RateLimitName("strong")) {
3332
authenticate("auth-digest") {
3433
route("token") {
3534
installTokenRouteDocumentation()
3635

3736
get {
38-
call.respond(authService.newToken())
37+
call.respond(authenticationService.newToken())
3938
}
4039
}
4140
}

src/main/kotlin/app/revanced/api/configuration/services/AuthService.kt

Lines changed: 0 additions & 49 deletions
This file was deleted.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package app.revanced.api.configuration.services
2+
3+
import com.auth0.jwt.JWT
4+
import com.auth0.jwt.algorithms.Algorithm
5+
import io.ktor.server.auth.*
6+
import io.ktor.server.auth.jwt.*
7+
import java.time.Instant
8+
import java.time.temporal.ChronoUnit
9+
import kotlin.text.HexFormat
10+
11+
internal class AuthenticationService private constructor(
12+
private val issuer: String,
13+
private val validityInMin: Long,
14+
private val jwtSecret: String,
15+
private val authSHA256Digest: ByteArray,
16+
) {
17+
@OptIn(ExperimentalStdlibApi::class)
18+
constructor(issuer: String, validityInMin: Long, jwtSecret: String, authSHA256DigestString: String) : this(
19+
issuer,
20+
validityInMin,
21+
jwtSecret,
22+
authSHA256DigestString.hexToByteArray(HexFormat.Default),
23+
)
24+
25+
fun AuthenticationConfig.jwt() {
26+
jwt("jwt") {
27+
realm = "ReVanced"
28+
29+
verifier(JWT.require(Algorithm.HMAC256(jwtSecret)).withIssuer(issuer).build())
30+
}
31+
}
32+
33+
fun AuthenticationConfig.digest() {
34+
digest("auth-digest") {
35+
realm = "ReVanced"
36+
algorithmName = "SHA-256"
37+
38+
digestProvider { _, _ ->
39+
authSHA256Digest
40+
}
41+
}
42+
}
43+
44+
fun newToken(): String {
45+
val issuedAt = Instant.now()
46+
47+
return JWT.create()
48+
.withIssuer(issuer)
49+
.withIssuedAt(issuedAt)
50+
.withExpiresAt(issuedAt.plus(validityInMin, ChronoUnit.MINUTES))
51+
.sign(Algorithm.HMAC256(jwtSecret))
52+
}
53+
}

0 commit comments

Comments
 (0)