Skip to content

Commit 3a1aad1

Browse files
authored
Merge pull request #46 from hasura/gavin/service-token-bearer-auth
Implement optional Bearer token auth w/ HASURA_SERVICE_TOKEN_SECRET env
2 parents 8c3cd96 + 97f868d commit 3a1aad1

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

ndc-app/src/main/kotlin/io/hasura/ndc/app/application/Filters.kt

+29
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package io.hasura.ndc.app.application
33
import io.vertx.core.http.HttpServerRequest
44
import jakarta.inject.Inject
55
import jakarta.ws.rs.container.ContainerRequestContext
6+
import jakarta.ws.rs.core.HttpHeaders
7+
import jakarta.ws.rs.core.Response
68
import jakarta.ws.rs.core.UriInfo
79
import org.jboss.logging.Logger
810
import org.jboss.resteasy.reactive.server.ServerRequestFilter
@@ -19,4 +21,31 @@ class Filters {
1921
logger.debug(b.result())
2022
}
2123
}
24+
25+
@ServerRequestFilter
26+
fun tokenFilter(ctx: ContainerRequestContext): Response? {
27+
val secret = System.getenv("HASURA_SERVICE_TOKEN_SECRET")
28+
if (secret.isNullOrEmpty()) {
29+
logger.warn("Environment variable HASURA_SERVICE_TOKEN_SECRET not set. Token validation is bypassed.")
30+
return null
31+
}
32+
33+
val authHeader = ctx.getHeaderString(HttpHeaders.AUTHORIZATION)
34+
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
35+
logger.error("Authorization header missing or not in Bearer format")
36+
return Response.status(Response.Status.UNAUTHORIZED).build()
37+
}
38+
39+
val token = authHeader.substringAfter("Bearer ")
40+
if (token.isEmpty()) {
41+
logger.error("Token is empty")
42+
return Response.status(Response.Status.UNAUTHORIZED).build()
43+
}
44+
if (token != secret) {
45+
logger.error("Token is invalid")
46+
return Response.status(Response.Status.UNAUTHORIZED).build()
47+
}
48+
49+
return null
50+
}
2251
}

ndc-app/src/main/resources/application.properties

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ quarkus.live-reload.instrumentation=true
77
quarkus.datasource.devservices.enabled=false
88
quarkus.opentelemetry.enabled=true
99

10-
1110
quarkus.index-dependency.ndc-ir.group-id=io.hasura
1211
quarkus.index-dependency.ndc-ir.artifact-id=ndc-ir
1312

0 commit comments

Comments
 (0)