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
相关产品推荐
相关产品推荐

