Mengenal OpenID Connect sebagai lapisan identitas di atas OAuth 2.0: struktur ID token sebagai JWT, klaim standar, alur-alur utama OIDC, UserInfo endpoint, serta penemuan konfigurasi via well-known dan JWKS.

Empat episode terakhir kalian bekerja dengan OAuth 2.0 murni: token, scopes, dan consent. Episode 9 ini membuka fase baru — OpenID Connect (OIDC). Kalau OAuth 2.0 menjawab pertanyaan "siapa yang boleh mengakses apa", OIDC menjawab pertanyaan yang lebih mendasar: "siapakah user ini, dan dari mana aplikasi tahu?" OIDC adalah jawaban standar yang dipakai Keycloak sebagai identity provider.
OIDC adalah identity layer yang dibangun di atas OAuth 2.0. Ia tidak menggantikan OAuth — ia menambahkan apa yang selama ini hilang:
Kunci di balik layar: access token dari OAuth 2.0 tetap ada, tetapi sekarang ada token kedua bernama ID token yang menjadi bukti autentikasi.
OIDC mewarisi alur alur OAuth 2.0, dengan nuansa masing-masing:
Aturan praktis yang aman: pakai authorization code flow dengan PKCE. Dua alur lainnya hanya untuk kompatibilitas.
ID token adalah JWT (JSON Web Token) — tiga bagian yang masing-masing di-encode base64url, dipisahkan titik:
alg, kid).Contoh payload ID token:
{
"exp": 1754213000,
"iat": 1754212700,
"auth_time": 1754212700,
"jti": "a3f2c1d0-...",
"iss": "https://kc.example.com/realms/my-realm",
"aud": "my-app",
"sub": "9c4d5e6f-...",
"typ": "ID",
"azp": "my-app",
"nonce": "1a2b3c4d",
"name": "Budi Santoso",
"preferred_username": "budi",
"email": "budi@example.com",
"email_verified": true
}Lihat typ bernilai ID — inilah penanda bahwa token ini memang ID token, bukan access token.
| Aspek | ID Token | Access Token |
|---|---|---|
| Tujuan | Membuktikan autentikasi user | Memberi akses ke API |
| Isi | Klaim identitas | Klaim otorisasi dan roles |
| Pemakaian | Dikonsumsi aplikasi klien | Dikirim ke resource server |
| Format | JWT selalu | JWT atau opaque |
| Klaim khas | sub, nonce, auth_time | scope, realm_access, resource_access |
Kesalahan klasik: mengirim ID token sebagai Bearer token ke API. ID token bukanlah pengganti access token — resource server tidak seharusnya memercayai token yang audiensnya adalah aplikasi klien.
OIDC mendefinisikan klaim standar yang wajib atau umum ada di ID token:
Di atas klaim standar, Keycloak bisa menambahkan custom claims lewat protocol mappers — misalnya atribut user atau role. Ini akan dibahas dalam di episode 10.
Menerima ID token tanpa validasi sama saja dengan membiarkan siapa pun masuk. Langkah wajibnya:
iss persis cocok dengan URL issuer realm.aud berisi client id kalian.exp belum lewat dan iat tidak masuk akal jauh ke masa depan.nonce yang disimpan saat memulai request.curl -s "https://kc.example.com/realms/my-realm/protocol/openid-connect/certs"protocol/openid-connect/certs mengembalikan kunci publik dalam format JWK. Di sebagian besar framework, langkah validasi ini ditangani middleware — tetapi kalian wajib memahami apa yang diperiksa.
Selain klaim di dalam ID token, OIDC menyediakan UserInfo endpoint untuk mengambil profil user secara terpisah:
curl -s -H "Authorization: Bearer eyJhbGciOi..." \
"https://kc.example.com/realms/my-realm/protocol/openid-connect/userinfo"Respons berupa JSON berisi klaim yang diizinkan oleh scope yang disetujui. Karena diambil dengan access token, response UserInfo bisa lebih kaya daripada ID token — ini soal strategi klaim yang dibahas di episode 10.
OIDC membungkus semua alamat endpoint dalam satu file metadata publik:
curl -s "https://kc.example.com/realms/my-realm/.well-known/openid-configuration"{
"issuer": "https://kc.example.com/realms/my-realm",
"authorization_endpoint": "https://kc.example.com/realms/my-realm/protocol/openid-connect/auth",
"token_endpoint": "https://kc.example.com/realms/my-realm/protocol/openid-connect/token",
"jwks_uri": "https://kc.example.com/realms/my-realm/protocol/openid-connect/certs",
"userinfo_endpoint": "https://kc.example.com/realms/my-realm/protocol/openid-connect/userinfo",
"end_session_endpoint": "https://kc.example.com/realms/my-realm/protocol/openid-connect/logout",
"grant_types_supported": ["authorization_code", "client_credentials", "refresh_token"]
}Dengan metadata ini, library OIDC apa pun bisa mengonfigurasi dirinya sendiri — cukup beri tahu URL issuer, sisanya ditemukan otomatis. /.well-known/openid-configuration adalah pintu masuk semua integrasi.
OIDC juga mendefinisikan dynamic client registration — client mendaftarkan dirinya sendiri ke Keycloak lewat request tanpa campur tangan admin. Keycloak mendukungnya di endpoint registrasi, tetapi fitur ini harus diaktifkan eksplisit di Realm settings karena membuka pintu pendaftaran otomatis. Untuk lingkungan produksi yang ketat, matikan saja dan daftarkan client secara manual.
Di episode 9 ini kalian mengenal OIDC: posisinya sebagai lapisan identitas di atas OAuth 2.0, alur-alur utamanya, struktur JWT ID token, klaim standar dan kustom, langkah validasi token, UserInfo endpoint, discovery metadata, dan dynamic client registration.
Inti yang harus dibawa pulang:
iss, aud, exp, signature, dan nonce.Di episode 10 berikutnya kalian akan membedah klaim OIDC dan user profile — klaim standar apa saja yang tersedia, bagaimana menambahkan atribut kustom lewat protocol mappers, dan kapan sebaiknya memakai ID token atau UserInfo endpoint.