Membedah Authorization Code flow langkah demi langkah: authorization request, login dan consent, kode, penukaran token, penggunaan access token, serta ekstensi PKCE untuk keamanan tambahan.

Episode 4 memperkenalkan OAuth 2.0 secara umum dan menyebut Authorization Code sebagai grant type paling aman untuk web app. Episode 5 ini membedahnya langkah demi langkah: bagaimana browser, aplikasi, dan Keycloak berkomunikasi, apa yang terjadi saat pengguna login, bagaimana kode ditukar menjadi token, dan bagaimana PKCE membuat alur ini tetap aman untuk SPA dan aplikasi mobile.
Authorization Code adalah grant type paling aman untuk aplikasi web karena password pengguna tidak pernah sampai ke aplikasi atau browser — pengguna berinteraksi langsung dengan halaman login Keycloak. Aplikasi hanya menerima kode berumur pendek yang ditukar dengan token di server, sehingga access token tidak pernah terekspos di URL atau JavaScript.
Karena keamanan inilah flow ini menjadi standar de facto untuk web app modern dan menjadi dasar dari banyak integrasi SSO.
Authorization Code flow berjalan dalam enam langkah utama:
| Langkah | Aktor | Apa yang Terjadi |
|---|---|---|
| 1. Authorization request | Browser ke Keycloak | Aplikasi mengarahkan browser ke endpoint auth |
| 2. Login | Browser ke Keycloak | Pengguna memasukkan kredensial di halaman login |
| 3. Consent | Browser ke Keycloak | Pengguna menyetujui izin yang diminta aplikasi |
| 4. Callback | Keycloak ke browser | Keycloak mengarahkan kembali dengan authorization code |
| 5. Token exchange | Aplikasi ke Keycloak | Aplikasi menukar kode menjadi access, refresh, dan ID token |
| 6. Access | Aplikasi ke resource server | Aplikasi memakai access token untuk memanggil API |
Aplikasi mengarahkan browser pengguna ke endpoint authorisasi Keycloak dengan beberapa parameter wajib:
http://localhost:8080/realms/belajar/protocol/openid-connect/auth?client_id=portal-app&redirect_uri=http://localhost:3000/callback&response_type=code&scope=openid&state=acak-1234Parameter response_type=code menandakan klien menginginkan alur authorization code, client_id menyebut aplikasi, redirect_uri tempat Keycloak mengarahkan kembali, dan state adalah nilai acak untuk proteksi CSRF yang harus diverifikasi saat callback.
Keycloak menampilkan halaman login. Setelah kredensial benar, jika aplikasi meminta scope tertentu, pengguna melihat halaman consent yang menjelaskan izin yang diminta. Persetujuan pengguna inilah esensi delegated authorization.
Setelah login berhasil, Keycloak mengarahkan browser kembali ke redirect_uri dengan menyisipkan code dan state di query string. Aplikasi wajib memverifikasi state sebelum melanjutkan. Kode ini berumur sangat pendek dan hanya bisa dipakai sekali.
Important
Selalu verifikasi parameter state saat callback tiba sebelum
memproses code. Tanpa verifikasi ini, aplikasi kalian rentan
terhadap serangan CSRF yang bisa membajak sesi login.
Aplikasi — bukan browser — menukar kode tersebut di token endpoint:
curl -X POST "http://localhost:8080/realms/belajar/protocol/openid-connect/token" \
-d "grant_type=authorization_code" \
-d "client_id=portal-app" \
-d "client_secret=rahasia-aplikasi" \
-d "code=KODE_DARI_CALLBACK" \
-d "redirect_uri=http://localhost:3000/callback"Responnya berisi access token, refresh token, dan ID token sekaligus. Access token dipakai untuk memanggil resource server, ID token memberi informasi identitas pengguna, dan refresh token untuk mendapatkan access token baru.
PKCE (Proof Key for Code Exchange) melindungi authorization code dari penyalahgunaan, terutama pada SPA dan aplikasi mobile yang tidak bisa menyimpan secret. Prinsipnya: aplikasi membuktikan bahwa kode yang dikirim memang miliknya.
S256 menghitung hash SHA-256, metode plain mengirim verifier apa adanya.Langkah PKCE dalam Authorization Code flow:
| Tahap | Nilai yang Dikirim |
|---|---|
| Awal alur | code_challenge dan code_challenge_method |
| Token exchange | code_verifier |
| Verifikasi | Keycloak mencocokkan challenge dari verifier |
Karena aplikasi mobile dan SPA tidak punya client_secret yang aman, PKCE menggantikan peran pembuktian identitas klien. Meskipun aplikasi server-side masih boleh memakai secret, praktik terbaik sekarang menyarankan PKCE di mana-mana.
Untuk mengaktifkan alur ini di Keycloak:
confidential jika aplikasi bisa menyimpan secret, public jika tidak (SPA dan mobile).redirect_uri yang valid secara eksplisit. Jangan pernah memakai wildcard yang longgar.S256 sebagai challenge method.Empat praktik terbaik yang menjaga alur ini tetap aman:
Episode 5 membedah Authorization Code flow: permintaan authorisasi ke endpoint /realms/{realm}/protocol/openid-connect/auth, login dan consent pengguna, callback berisi kode, penukaran kode menjadi access, refresh, dan ID token di token endpoint, hingga ekstensi PKCE yang membuat alur ini aman untuk SPA dan mobile.
Inti yang harus dibawa pulang:
Di episode 6 berikutnya, kita membahas Client Credentials flow — bagaimana service backend berkomunikasi satu sama lain tanpa pengguna, lengkap dengan service accounts dan praktik terbaiknya.