You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus与Smallrye JWT原生模式下无法生成Token问题

Quarkus原生镜像模式下JWT Token生成失败问题

我使用Quarkus、Smallrye JWT和Kotlin搭建了一个生成JWT Token的小型项目。JVM模式运行时Token生成功能正常,但构建为原生镜像运行后,接口返回空对象,无日志报错。

环境配置

生成公私钥

openssl genrsa -out PrivateKey.pem 2048
openssl rsa -in PrivateKey.pem -outform PEM -pubout -out PublicKey.pem

生成后将密钥移动至resources/META-INF/keys目录。

配置application.yml

smallrye:
  jwt:
    sign:
      key:
        location: "META-INF/keys/PrivateKey.pem"
    encrypt:
      key:
        location: "META-INF/keys/PublicKey.pem"
    verify:
      key:
        location: "META-INF/keys/PublicKey.pem"

代码实现

TokenService

@ApplicationScoped
class TokenService {

    fun generateToken(): String {
        val now = Instant.now()
        return Jwt.claims()
            .subject(UUID.randomUUID().toString())
            .upn("johndoe@example.com")
            .groups(setOf("SOME ROLE"))
            .issuer("A Issuer")
            .issuedAt(now)
            .expiresIn(Duration.ofHours(1))
            .expiresAt(now.plus(1, ChronoUnit.HOURS))
            .claim(Claims.email, "johndoe@example.com")
            .claim(Claims.given_name, "John")
            .claim(Claims.family_name, "Doe")
            .claim(Claims.full_name, "John Doe")
            .claim("some_custom_claim", "a value")
            .sign()
    }
}

JwtController与响应类

@Path("/generate-token")
class JwtController(private val tokenService: TokenService) {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    fun generateToken(): Response {
        val token = tokenService.generateToken()
        return Response.ok(TokenResponse(token)).build()
    }
}

data class TokenResponse(
    @field:JsonProperty("token")
    val token: String
)

构建与运行

JVM模式

  • Java版本:17.0.8(Temurin)
  • Kotlin版本:1.9
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment Temurin-17.0.8+7 (build 17.0.8+7)
OpenJDK 64-Bit Server VM Temurin-17.0.8+7 (build 17.0.8+7, mixed mode, sharing)

构建与运行命令:

quarkus build
java -jar ./build/quarkus-app/quarkus-run.jar

请求命令:

curl --request POST --url http://localhost:8080/generate-token

响应(200 OK):

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIzOGYwOTc1YS0zNjk1LTQxMDYtODUwNC1kZmZlYTk4ZGU5NWEiLCJ1cG4iOiJqb2huZG9lQGV4YW1wbGUuY29tIiwiZ3JvdXBzIjpbIlNPTUUgUk9MRSJdLCJpc3MiOiJBIElzc3VlciIsImlhdCI6MTY5MzIyMjA2NiwiZXhwIjoxNjkzMjI1NjY2LCJlbWFpbCI6ImpvaG5kb2VAZXhhbXBsZS5jb20iLCJnaXZlbl9uYW1lIjoiSm9obiIsImZhbWlseV9uYW1lIjoiRG9lIiwiZnVsbF9uYW1lIjoiSm9obiBEb2UiLCJzb21lX2N1c3RvbV9jbGFpbSI6ImEgdmFsdWUiLCJqdGkiOiJkOTE0ZmZmMy1mOGIzLTRlOTYtOGIzZC0zZTE5NjJlODg5YjgifQ.TBUy4RE82KcNop-Wfhbbml8vnZbO8zuY0DgnW9zIcfXYOBl60XubAMFspEzG90nV_au7IYiSvXIZW4AJV8XJhU56c9jC9LRB4c_z0TLfFnBAmxjNyBQ-3D8T2W3RwENnK9lwsMq789T4SuUzlNB8ouxDKO9x5UmDuKqym_SuH3z5PXDrfHqWbaMoiYK7v8ftKuK2HtuYlAokVO7dvFh1vRIUYoRGy1VmJSfk8QIRqXRGm5rWE9IkJFw5UDzcAF6L8WAWP4cYBeGzE49Xy3lG3J6MsY_FHN8ehUaa_ItKs-dANx-yW0oWJcmdS3kPjjN6kkuKGUTbcCsvxF5-IXdPHw"
}

原生模式

切换到Mandrel JDK并构建原生镜像:

sdk use java 23.r17-mandrel
quarkus build --native

运行原生镜像:

./build/jwt-native-1.0.0-SNAPSHOT-runner

请求命令:

curl --request POST --url http://localhost:8080/generate-token

响应(200 OK):

{}

内容的提问来源于stack exchange,提问作者humungs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:13:09