Quarkus JWT Dasar- Security dengan Spesfifikasi MicroProfile JWT
1. Menambahkan Dependencies
Jika Anda sudah memiliki proyek Quarkus yang terkonfigurasi, Anda dapat menambahkan ekstensi smallrye-jwt ke proyek Anda dengan menjalankan salah satu perintah berikut di direktori dasar proyek (sesuai build tools anda):
- quarkus extension add smallrye-jwt,smallrye-jwt-build
- ./mvnw quarkus:add-extension -Dextensions='smallrye-jwt,smallrye-jwt-build'
- ./gradlew addExtension --extensions='smallrye-jwt,smallrye-jwt-build'
2. Berikut hasilnya pada Maven Project:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt-build</artifactId>
</dependency>
Dan berikut hasil jika pada Gradle Project:
implementation("io.quarkus:quarkus-smallrye-jwt")
implementation("io.quarkus:quarkus-smallrye-jwt-build")
Penambahan Lines pada Khusus pada Gradle Project
Pada build.gradle tambahkan lines berikut ini (Maven tidak perlu):
plugins {
id 'java'
id 'io.quarkus'
id 'application'
}
application {
mainClass = "com.yoesoff.plate.security.jwt.GenerateToken"
}
run {
systemProperty 'smallrye.jwt.sign.key.location', 'privateKey.pem'
}
3. Generate PEM Files
Buat pasangan public key dan private key dengan menggunakan OpenSSL command line tool dengan perintah OpenSSL untuk membuat kunci:
$ openssl genrsa -out rsaPrivateKey.pem 2048
$ openssl rsa -pubout -in rsaPrivateKey.pem -out publicKey.pem
Langkah tambahan diperlukan untuk membuat dan mengonversi private key ke format PKCS#8, yang umum digunakan untuk penyimpanan dan pengiriman kunci secara aman.
Perintah OpenSSL untuk melakukan konversi:
$ openssl pkcs8 -topk8 -nocrypt -inform pem -in rsaPrivateKey.pem -outform pem -out privateKey.pem
Rangkuman Semua Perintah Diatas
4. Penambahan Lines pada application.properties
lokasi : src/main/resources/application.properties
mp.jwt.verify.publickey.location=publicKey.pem
mp.jwt.verify.issuer=https://example.com/issuer
quarkus.native.resources.includes=publicKey.pem
5. File GenerateToken
Untuk file com.yoesoff.plate.security.jwt.GenerateToken ini akan diguanakn untuk membuat token via cli.
package com.yoesoff.plate.security.jwt;
import java.util.Arrays;
import java.util.HashSet;
import org.eclipse.microprofile.jwt.Claims;
import io.smallrye.jwt.build.Jwt;
public class GenerateToken {
public static void main(String[] args) {
String token = Jwt.issuer("https://example.com/issuer")
.upn("jdoe@quarkus.io")
.groups(new HashSet<>(Arrays.asList("User", "Admin")))
.claim(Claims.birthdate.name(), "2001-07-13")
.sign();
System.out.println(token);
System.exit(0);
}
}
Kode ini adalah program Java sederhana untuk membuat JWT (JSON Web Token) menggunakan SmallRye JWT.
-
Package & Import
-
com.yoesoff.plate.security.jwt
→ lokasi paket kelas. -
Mengimpor kelas dari
io.smallrye.jwt.build.Jwt
untuk membangun token JWT, sertaClaims
untuk klaim standar JWT.
-
-
Class & Method
-
GenerateToken
→ nama kelas. -
main
→ titik masuk program.
-
-
Pembuatan Token
issuer(...)
→ menetapkan penerbit token (URL asal token).upn(...)
→ menetapkan User Principal Name (identitas pengguna).groups(...)
→ menetapkan peran/role pengguna (User
,Admin
)claim(...)
→ menambahkan klaim kustom, di sini tanggal lahir.sign()
→ menandatangani token dengan kunci privat sesuai konfigurasi. Output
System.out.println(token);
→ mencetak token JWT ke layar.System.exit(0);
→ menghentikan program setelah selesai.
6. Buat APIs Controller TokenSecuredResource
package com.yoesoff.plate.security.jwt;
import jakarta.annotation.security.PermitAll;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.InternalServerErrorException;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.SecurityContext;
import org.eclipse.microprofile.jwt.JsonWebToken;
@Path("/secured")
public class TokenSecuredResource {
@Inject
JsonWebToken jwt;
@GET
@Path("permit-all")
@PermitAll
@Produces(MediaType.TEXT_PLAIN)
public String hello(@Context SecurityContext ctx) {
return getResponseString(ctx);
}
@GET
@Path("roles-allowed")
@RolesAllowed({ "User", "Admin" })
@Produces(MediaType.TEXT_PLAIN)
public String helloRolesAllowed(@Context SecurityContext ctx) {
return getResponseString(ctx) + ", birthdate: " + jwt.getClaim("birthdate").toString();
}
private String getResponseString(SecurityContext ctx) {
String name;
if (ctx.getUserPrincipal() == null) {
name = "anonymous";
} else if (!ctx.getUserPrincipal().getName().equals(jwt.getName())) {
throw new InternalServerErrorException("Principal and JsonWebToken names do not match");
} else {
name = ctx.getUserPrincipal().getName();
}
return String.format("hello %s,"
+ " isHttps: %s,"
+ " authScheme: %s,"
+ " hasJWT: %s",
name, ctx.isSecure(), ctx.getAuthenticationScheme(), hasJwt());
}
private boolean hasJwt() {
return jwt.getClaimNames() != null;
}
}
7. Dapatkan Token via CLI (Server On!)
"Pastikan aplikasi sudah berjalan sebelum menghasilkan JSON Web Token (JWT) untuk endpoint TokenSecuredResource
."
Dapatkan Token Dengan Maven CLI
mvn exec:java -Dexec.mainClass=com.yoesoff.plate.security.jwt.GenerateToken -
Dexec.classpathScope=test -Dsmallrye.jwt.sign.key.location=privateKey.pem
Dapatkan Token Dengan Gradle CLI
./gradlew run -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Dsmallrye.jwt.sign.key.location=privateKey.pem
8. HTTP Request Tanpa Token
curl -v http://127.0.0.1:8080/secured/roles-allowed; echo
Request Dengan Token
Hit Dengan Curl
curl -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2V4YW1wbGUuY29tL2lzc3VlciIsInVwbiI6Impkb2VAcXVhcmt1cy5pbyIsImdyb3VwcyI6WyJVc2VyIiwiQWRtaW4iXSwiYmlydGhkYXRlIjoiMjAwMS0wNy0xMyIsImlhdCI6MTc1NDYzOTY4MiwiZXhwIjoxNzU0NjM5OTgyLCJqdGkiOiI3MTUzNWJkYi03NGMyLTRkMmYtODE4Ny1lMmY4MDY4NDMxMmQifQ.RfsOQfybGpXINXIW7TQFWNwksrrFarpslDD2nYz5x-bAh-ufFFvE9rjHBNOdlan0E7pENUdKHgGL0PKiMhiUumDLwr1R8ZhJ5H6LIt9xy1sdy0v_7P6BFvY3nD_423UxisHw1Xmp5xlBlbEOgdJDM7bsiJFZqChOpip5ic_sS4v4dM3pV348Asv4uLDxPB974JjayjeHPBrHm7Keo_8LLkxyOz5j-fywi3rhDutGbAtU6ucV5dckPH_zqflf272vozC3QSzpI6HH3M1aN87q5UaQNqlif6tDy9wRYE6C7UxF7-cnBcu3JSONbsp1RJgv5o8kbZN9rj13werE2vQkVwAu" http://127.0.0.1:8080/secured/roles-allowed; echo
Hit Dengan Postman
Sumber: https://docs.redhat.com/en/documentation/red_hat_build_of_quarkus/3.20/pdf/microprofile_json_web_token_jwt_authentication/Red_Hat_build_of_Quarkus-3.20-Microprofile_JSON_Web_Token_JWT_authentication-en-US.pdf
Comments
Post a Comment