Memahami property mapping di Authentik: ekspresi Python yang menentukan isi claim OIDC, mapping bawaan untuk profile, email, dan groups, scope mapping kustom, serta cara debugging mapping dengan tester dan token preview.

Di episode 8, kalian berhasil menerbitkan token lewat OAuth2 provider. Tapi token itu seperti koper yang masih kosong: semua identitas user sudah tersedia di Authentik, namun belum ada yang memutuskan apa yang masuk ke dalamnya.
Keputusan itu ada di tangan property mappings. Analoginya begini: token adalah koper, property mapping adalah kurir yang memilih barang yang boleh dibawa keluar. Aplikasi hanya bisa membaca data yang dikirim — jadi memahami mapping adalah cara kalian mengendalikan apa yang dilihat setiap aplikasi, dan apa yang bocor keluar.
Property mapping adalah ekspresi Python yang mengembalikan sebuah nilai untuk dikirim ke aplikasi. Jenis mapping bergantung pada provider:
Ada satu aturan penting: mengembalikan None berarti mapping dilewati — nilainya tidak muncul sama sekali. Konteks yang tersedia dalam ekspresi umumnya meliputi user, request, dan provider (untuk scope mapping), plus helper yang sama seperti di episode 6: regex_match, regex_replace, dan ak_is_group_member.
Authentik menyertakan beberapa scope mapping standar yang langsung bisa dipakai:
Scope profile di provider OAuth2 menunjuk ke mapping profile, scope email menunjuk ke mapping email, dan seterusnya. Jadi ketika sebuah aplikasi meminta scope, inilah isi yang otomatis ikut.
Important
Sejak rilis 2025.10, claim email_verified defaultnya bernilai False. Authentik tidak bisa memastikan sendiri apakah email user benar-benar terverifikasi, dan mengklaim sebaliknya bisa menimbulkan risiko keamanan. Beberapa aplikasi menolak login jika claim ini False — solusinya adalah mapping kustom, bukan sekadar mengubah default.
Scope mapping biasanya mengembalikan dictionary. Setiap pasangan kunci-nilai menjadi claim dalam token. Contoh paling sederhana: mapping kustom yang mengirim daftar grup user.
return {
"groups": [group.name for group in request.user.ak_groups.all()],
}Relasi ak_groups.all() mengambil semua grup tempat user terdaftar, lalu list comprehension mengumpulkan nama-namanya. Hasilnya, token berisi claim groups berisi daftar seperti ["dev", "ops"] yang bisa dipakai aplikasi untuk menetapkan peran.
Untuk membuat mapping sendiri: masuk ke Customization > Property Mappings, klik Create, lalu pilih tipe Scope Mapping. Ada tiga field penting: nama, scope yang akan diisi, dan ekspresi.
Contoh klasik yang sering dibutuhkan: memperbaiki claim email agar email_verified mengikuti status yang kalian simpan sebagai atribut user.
return {
"email": request.user.email,
"email_verified": request.user.attributes.get("email_verified", False),
}Atau mengambil atribut kustom yang disetel di episode 5:
return {
"department": request.user.attributes.get("department", "unknown"),
}Tip
Gunakan .get(kunci, default) untuk membaca atribut kustom. Mengakses atribut yang tidak ada secara langsung akan memicu error seperti KeyError, dan satu error dalam mapping bisa menggagalkan seluruh penerbitan token.
Scope dan claim adalah dua hal berbeda yang saling terkait:
openid, profile, email, atau scope kustom buatan kalian.Aplikasi yang meminta scope profile menerima claim dari mapping yang terikat ke scope itu. Jika kalian membuat scope kustom bernama roles dengan mapping yang mengembalikan daftar peran, aplikasi harus meminta scope roles agar claim-nya muncul. Request scope yang tidak terkonfigurasi akan ditolak — dan ini salah satu sumber error integrasi yang akan kalian temui di episode 10.
Perlu diingat juga: jika klien tidak meminta scope apa pun, Authentik memperlakukan semua scope default sebagai diminta (pelajaran dari episode 8). Scope kustom tidak termasuk dalam perilaku itu.
Setelah mapping dibuat, tambahkan ke provider OAuth2 pada bagian scope mappings. Alur lengkapnya:
roles.roles saat inisialisasi klien OIDC-nya.Untuk keputusan otorisasi berbasis scope yang lebih ketat, episode 6 juga memberi alat: expression policy bisa memeriksa scope yang diminta lewat konteks khusus, misalnya menolak scope admin kecuali user anggota grup tertentu.
Mapping adalah kode — jadi ia bisa error, dan debugging-nya butuh alat yang tepat:
Warning
Jangan pernah menaruh informasi sensitif seperti password hash, token rahasia, atau data pribadi berlebihan ke dalam claim. Claim yang masuk token akan dibaca oleh aplikasi dan bisa bocor melalui log aplikasi tersebut. Kirim hanya yang memang dibutuhkan.
Poin kunci episode ini:
email_verified defaultnya False.Sekarang koper token sudah diisi sesuai keinginan. Tinggal mempraktikkannya ke aplikasi sungguhan. Di episode 10, kalian akan mengintegrasikan Grafana, Nextcloud, Portainer, dan Gitea dengan OIDC Authentik — lengkap dengan walkthrough alur login dan troubleshooting error yang paling sering membuat admin garuk kepala.