Episode ini membahas OAuth2 dan OIDC di Quarkus: integrasi dengan external identity provider, implementasi JWT authentication dan authorization, service-to-service auth dengan token introspection, serta best practice penyimpanan dan refresh token.

Basic auth cukup untuk aplikasi kecil, tapi aplikasi modern butuh federasi identitas: pengguna login di satu tempat (Google, GitHub, Keycloak) lalu mengakses banyak layanan. Di sinilah OAuth2 dan OpenID Connect (OIDC) berperan.
Episode 13 membahas integrasi Quarkus dengan OIDC external identity provider, implementasi JWT authentication dan authorization, service-to-service auth dengan token introspection, serta best practice penyimpanan, refresh, dan scope token.
./mvnw quarkus:add-extension -Dextensions=oidcPerintah ./mvnw quarkus:add-extension -Dextensions=oidc menambahkan dukungan OIDC ke project.
Hubungkan Quarkus ke identity provider (misalnya Keycloak) lewat konfigurasi:
quarkus.oidc.auth-server-url=https://auth.example.com/realms/demo
quarkus.oidc.client-id=quarkus-app
quarkus.oidc.credentials.secret=client-secret
quarkus.oidc.tls.verification=certificate-validationauth-server-url: endpoint realm OIDC provider.client-id dan credentials.secret: kredensial aplikasi untuk authorization code flow.tls.verification: pastikan sertifikat server divalidasi.Setelah konfigurasi, endpoint bisa diproteksi hanya dengan konfigurasi:
quarkus.http.auth.permission.authenticated.paths=/api/*
quarkus.http.auth.permission.authenticated.policy=authenticatedAturan ini menolak semua request ke /api/* tanpa token valid dari provider.
JWT (JSON Web Token) adalah token berformat header.payload.signature. Payload berisi klaim seperti sub, exp, dan roles. Signature menjamin token tidak dimodifikasi. Quarkus memvalidasi signature memakai key dari provider OIDC — tanpa memanggil server di setiap request.
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.eclipse.microprofile.jwt.JsonWebToken;
@Path("/api/user")
public class UserResource {
@Inject
JsonWebToken jwt;
@GET
@RolesAllowed("user")
public String info() {
return "Halo " + jwt.getSubject();
}
}jwt.getSubject() mengembalikan klaim sub — identitas pengguna. Anotasi @RolesAllowed("user") memverifikasi klaim roles pada token.
Pastikan identity provider mengirim klaim roles. Di Keycloak, pemetaan role menjadi klaim ini diatur di client scope. Jika nama klaim berbeda, peta lewat konfigurasi:
quarkus.oidc.roles.claim=rolesTidak semua service memakai JWT. Opaque token perlu diverifikasi lewat introspection endpoint:
quarkus.oidc.token.audience=quarkus-app
quarkus.oidc.token-issuer=https://auth.example.com/realms/demoSaat client mengirim token opaque ke Authorization: Bearer, Quarkus memanggil endpoint introspection provider untuk memvalidasi dan mengambil klaim. Ini umum dipakai untuk komunikasi antar service internal.
Service-to-service tanpa intervensi pengguna memakai client credentials flow:
import io.quarkus.oidc.client.OidcClient;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@ApplicationScoped
public class InternalApiClient {
@Inject
OidcClient oidcClient;
public String panggilServiceInternal() {
String token = oidcClient.getTokens().await().indefinitely()
.getAccessToken();
return kirimRequest(token);
}
}oidcClient.getTokens() memperoleh access token dengan client credentials. Token ini dipakai untuk memanggil service internal lain — pola umum pada arsitektur microservices.
Di browser, simpan access token di memori, bukan localStorage (rentan XSS). Untuk aplikasi native, simpan aman di keychain. Di server, jangan pernah log token — JWT berisi identitas sensitif.
Minta scope sekecil mungkin:
quarkus.oidc.scopes=openid,profilequarkus.oidc.scopes menentukan klaim yang diminta dari provider. Semakin sedikit data yang diminta, semakin kecil permukaan serangan.
Access token berumur pendek (misal 5 menit); refresh token memperoleh access token baru tanpa login ulang. Quarkus mengelola ini otomatis untuk aplikasi berbasis web. Aturan utama: refresh token hanya dikirim ke server, tidak pernah ke client-side JavaScript. Untuk logout, panggil endpoint logout provider:
quarkus.oidc.logout.path=/api/logout
quarkus.oidc.logout.post-logout-path=/Episode 13 membawa kalian ke keamanan modern: memahami integrasi Quarkus OIDC dengan external identity provider, implementasi JWT authentication dan authorization, service-to-service auth dengan token introspection dan client credentials flow, serta best practice penyimpanan, refresh, dan scope token.
Inti yang harus dibawa pulang:
@RolesAllowed membaca klaim roles dari token.Di episode 14 selanjutnya kita akan membahas secure microservices dan API gateway — pola secure microservices dengan Quarkus, integrasi dengan Istio, Envoy, atau API gateway, securing inter-service communication, serta rate limiting dan API policy.