Episode ini membahas autentikasi terpusat: directive forward_auth, integrasi dengan Authelia, Authentik, OAuth2 Proxy, dan Keycloak, pengiriman header dari respons auth, serta pola global auth dengan snippet untuk melindungi banyak aplikasi.

Basic auth cukup untuk satu situs, tapi bagaimana kalau kalian punya sepuluh aplikasi yang semuanya butuh login? Membuat autentikasi di tiap aplikasi itu membosankan dan tidak konsisten. Solusinya: forward auth — Caddy meneruskan setiap request ke layanan autentikasi terpusat, yang memutuskan diterima atau ditolak.
Episode 18 membahas directive forward_auth, integrasi dengan provider populer seperti Authelia, Authentik, OAuth2 Proxy, dan Keycloak, cara menyalin header dari respons auth ke aplikasi, serta pola global auth dengan snippet untuk melindungi banyak aplikasi sekaligus.
Ini adalah cara modern melindungi homelab dan internal services: satu login, semua aplikasi aman.
Alur forward auth di Caddy:
Keunggulannya: aplikasi tidak perlu tahu apa pun tentang autentikasi. Caddy dan layanan auth yang menanganinya.
forward_auth memakai URL auth service:
app.example.com {
forward_auth localhost:9091 {
uri /api/verify?rd=https://login.example.com
copy_headers Authorization Remote-User
}
reverse_proxy localhost:8080
}uri menentukan endpoint verifikasi di layanan auth.copy_headers menyalin header dari respons auth ke request yang diteruskan ke aplikasi.forward_auth localhost:9091 menunjuk ke layanan auth yang berjalan lokal.
copy_headers Remote-User memberi tahu aplikasi siapa penggunanya. Aplikasi membaca header Remote-User untuk mengetahui identitas tanpa mengimplementasikan login sendiri. Ini pola standar saat memakai Authelia atau OAuth2 Proxy.
Authelia adalah auth service populer untuk homelab:
{
snippet authelia {
forward_auth authelia:9091 {
uri /api/authz/forward-auth?authelia_url=https%3A%2F%2Fauth.example.com
copy_headers Remote-User Remote-Groups Remote-Email
}
}
}
app.example.com {
import authelia
reverse_proxy localhost:8080
}
internal.example.com {
import authelia
reverse_proxy localhost:9000
}Snippet authelia dipakai ulang di banyak situs. Authentik memakai pola serupa dengan endpoint /api/v1/auth/flow/.... Dengan satu logat, semua aplikasi yang meng-import snippet terlindungi.
OAuth2 Proxy menjadi penghubung ke provider OAuth2:
{
snippet oauth {
forward_auth localhost:4180 {
uri /oauth2/auth
copy_headers X-Auth-Request-User X-Auth-Request-Email
}
}
}
app.example.com {
import oauth
reverse_proxy localhost:8080
}Keycloak bisa dipakai langsung atau lewat OAuth2 Proxy. Pola yang sama berlaku: forward auth di depan, header identitas di belakang.
Single Sign-On (SSO) memungkinkan satu login untuk semua aplikasi. Komponennya:
Dengan Caddy di depan setiap aplikasi, tidak ada aplikasi yang menangani login sendiri — konsistensi dijamin.
Secure dan HttpOnly.Tidak semua path harus dilindungi:
app.example.com {
@public {
path /public/* /assets/*
}
forward_auth localhost:9091 {
uri /api/verify
copy_headers Remote-User
}
@proteksi {
not path /public/* /assets/*
}
handle @proteksi {
reverse_proxy localhost:8080
}
handle {
root * /var/www
file_server
}
}Halaman /public/* dan aset statis dibiarkan terbuka; sisanya di-proxy setelah auth. Perhatikan matcher @proteksi dengan not — kebalikan dari path publik.
Pola yang paling umum: sebagian konten publik, sebagian lagi butuh login. Kombinasi matcher @public dan @proteksi di atas adalah blueprint-nya. Publik melayani file statis, terproteksi melayani aplikasi.
Episode 18 membuka autentikasi terpusat: konsep forward auth, directive forward_auth dengan uri dan copy_headers, integrasi Authelia, Authentik, OAuth2 Proxy, dan Keycloak, SSO dengan session terpusat dan logout, serta pola snippet untuk melindungi banyak aplikasi sekaligus.
Inti yang harus dibawa pulang:
copy_headers mengirim identitas pengguna ke aplikasi.not membatasi area yang dilindungi.Di episode 19 selanjutnya kita akan membahas IP filtering & access control — matcher remote_ip dengan CIDR, whitelist dan blacklist, trusted_proxies untuk deteksi IP asli, GeoIP filtering dengan plugin, serta rate limiting untuk perlindungan DDoS dasar.