Quarkus JWT 身份验证不能用作本机应用程序
Quarkus JWT authentication doesn't work as a native app
我使用以下命令创建了一个新的 Quarkus 应用程序:
mvn io.quarkus:quarkus-maven-plugin:1.13.7.Final:create \
-DprojectGroupId=com.okta.rest \
-DprojectArtifactId=quarkus \
-DclassName="com.okta.rest.quarkus.HelloResource" \
-Dpath="/hello" \
-Dextensions="smallrye-jwt"
然后,我修改生成的HelloResource
打印出用户名
package com.okta.rest.quarkus;
import io.quarkus.security.Authenticated;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;
import java.security.Principal;
@Path("/hello")
public class HelloResource {
@GET
@Path("/")
@Authenticated
@Produces(MediaType.TEXT_PLAIN)
public String hello(@Context SecurityContext context) {
Principal userPrincipal = context.getUserPrincipal();
return "Hello, " + userPrincipal.getName() + "!";
}
}
为了与 Okta 一起使用,我向 application.properties
添加了几个属性:
mp.jwt.verify.publickey.location=https://dev-1309757.okta.com/oauth2/default/v1/keys
mp.jwt.verify.issuer=https://dev-1309757.okta.com/oauth2/default
我修复了 HelloResourceTest
所以它现在需要 401。
package com.okta.rest.quarkus;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
public class HelloResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(401);
}
}
然后,我运行./mvnw quarkus:dev
。我能够使用 OIDC Debugger 生成有效的访问令牌并使用 HTTPie 访问此 API。
http :8080/hello Authorization:"Bearer $TOKEN"
响应是:
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: text/plain;charset=UTF-8
Hello, matt.raible@okta.com!
但是,如果我使用 ./mvnw package -Pnative
将其构建为本机映像并尝试 运行 它,我将无法访问 API.
我不确定 Unable to get GraalVM version
错误是否是构建时需要担心的问题。
[INFO] --- quarkus-maven-plugin:1.13.7.Final:build (default) @ quarkus ---
[INFO] [org.jboss.threads] JBoss Threads version 3.2.0.Final
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building native image source jar: /Users/mraible/graalvm-java/quarkus/target/quarkus-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-1.0.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from /Users/mraible/graalvm-java/quarkus/target/quarkus-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-1.0.0-SNAPSHOT-runner.jar
[ERROR] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Unable to get GraalVM version from the native-image binary.
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] /Users/mraible/.sdkman/candidates/java/21.1.0.r11-grl/bin/native-image ...
运行 ./target/quarkus-1.0.0-SNAPSHOT-runner
开始一切正常。
2021-06-14 16:19:10,616 INFO [io.quarkus] (main) quarkus 1.0.0-SNAPSHOT native (powered by Quarkus 1.13.7.Final) started in 0.020s. Listening on: http://0.0.0.0:8080
2021-06-14 16:19:10,617 INFO [io.quarkus] (main) Profile prod activated.
2021-06-14 16:19:10,617 INFO [io.quarkus] (main) Installed features: [cdi, mutiny, resteasy, security, smallrye-context-propagation, smallrye-jwt, vertx, vertx-web]
但是,我无法使用有效的访问令牌访问 /hello
端点。
$ http :8080/hello Authorization:"Bearer $TOKEN"
HTTP/1.1 401 Unauthorized
content-length: 0
www-authenticate: Bearer {token}
如果我停止本机应用程序并且 运行 ./mvnw quarkus:dev
,相同的命令有效。
$ http :8080/hello Authorization:"Bearer $TOKEN"
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: text/plain;charset=UTF-8
Hello, matt.raible@okta.com!
请启用 quarkus-smallrye-jwt TRACE logging 查看令牌被拒绝的原因。
事实上,正如您还发现的那样,需要在本机图像中启用 https
协议,这可以通过将 <quarkus.native.additional-build-args>--enable-url-protocols=https</quarkus.native.additional-build-args>
添加到本机配置文件的属性来完成,如您所示:-)在 pom.xml
.
This PR 将确保不需要手动添加它。
谢谢
我使用以下命令创建了一个新的 Quarkus 应用程序:
mvn io.quarkus:quarkus-maven-plugin:1.13.7.Final:create \
-DprojectGroupId=com.okta.rest \
-DprojectArtifactId=quarkus \
-DclassName="com.okta.rest.quarkus.HelloResource" \
-Dpath="/hello" \
-Dextensions="smallrye-jwt"
然后,我修改生成的HelloResource
打印出用户名
package com.okta.rest.quarkus;
import io.quarkus.security.Authenticated;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;
import java.security.Principal;
@Path("/hello")
public class HelloResource {
@GET
@Path("/")
@Authenticated
@Produces(MediaType.TEXT_PLAIN)
public String hello(@Context SecurityContext context) {
Principal userPrincipal = context.getUserPrincipal();
return "Hello, " + userPrincipal.getName() + "!";
}
}
为了与 Okta 一起使用,我向 application.properties
添加了几个属性:
mp.jwt.verify.publickey.location=https://dev-1309757.okta.com/oauth2/default/v1/keys
mp.jwt.verify.issuer=https://dev-1309757.okta.com/oauth2/default
我修复了 HelloResourceTest
所以它现在需要 401。
package com.okta.rest.quarkus;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
public class HelloResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(401);
}
}
然后,我运行./mvnw quarkus:dev
。我能够使用 OIDC Debugger 生成有效的访问令牌并使用 HTTPie 访问此 API。
http :8080/hello Authorization:"Bearer $TOKEN"
响应是:
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: text/plain;charset=UTF-8
Hello, matt.raible@okta.com!
但是,如果我使用 ./mvnw package -Pnative
将其构建为本机映像并尝试 运行 它,我将无法访问 API.
我不确定 Unable to get GraalVM version
错误是否是构建时需要担心的问题。
[INFO] --- quarkus-maven-plugin:1.13.7.Final:build (default) @ quarkus ---
[INFO] [org.jboss.threads] JBoss Threads version 3.2.0.Final
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building native image source jar: /Users/mraible/graalvm-java/quarkus/target/quarkus-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-1.0.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from /Users/mraible/graalvm-java/quarkus/target/quarkus-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-1.0.0-SNAPSHOT-runner.jar
[ERROR] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Unable to get GraalVM version from the native-image binary.
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] /Users/mraible/.sdkman/candidates/java/21.1.0.r11-grl/bin/native-image ...
运行 ./target/quarkus-1.0.0-SNAPSHOT-runner
开始一切正常。
2021-06-14 16:19:10,616 INFO [io.quarkus] (main) quarkus 1.0.0-SNAPSHOT native (powered by Quarkus 1.13.7.Final) started in 0.020s. Listening on: http://0.0.0.0:8080
2021-06-14 16:19:10,617 INFO [io.quarkus] (main) Profile prod activated.
2021-06-14 16:19:10,617 INFO [io.quarkus] (main) Installed features: [cdi, mutiny, resteasy, security, smallrye-context-propagation, smallrye-jwt, vertx, vertx-web]
但是,我无法使用有效的访问令牌访问 /hello
端点。
$ http :8080/hello Authorization:"Bearer $TOKEN"
HTTP/1.1 401 Unauthorized
content-length: 0
www-authenticate: Bearer {token}
如果我停止本机应用程序并且 运行 ./mvnw quarkus:dev
,相同的命令有效。
$ http :8080/hello Authorization:"Bearer $TOKEN"
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: text/plain;charset=UTF-8
Hello, matt.raible@okta.com!
请启用 quarkus-smallrye-jwt TRACE logging 查看令牌被拒绝的原因。
事实上,正如您还发现的那样,需要在本机图像中启用 https
协议,这可以通过将 <quarkus.native.additional-build-args>--enable-url-protocols=https</quarkus.native.additional-build-args>
添加到本机配置文件的属性来完成,如您所示:-)在 pom.xml
.
This PR 将确保不需要手动添加它。
谢谢