Menyambungkan aplikasi sebagai SAML service provider ke Keycloak: mengenal SP populer seperti Salesforce dan Google Workspace, pertukaran metadata, konfigurasi entity ID dan ACS URL, pemetaan NameID dan atribut, serta pengujian dengan SAML Tracer dan penanganan error umum.

Di episode 13 kalian menyalakan Keycloak sebagai SAML IdP: membuat SAML client, mengekspor metadata, dan mengatur kunci signing. Episode 14 ini melengkapinya dari sisi seberang: service provider. Kalian akan menyambungkan aplikasi-aplikasi nyata — Salesforce, Google Workspace, AWS, hingga Jira dan Confluence — dengan bertukar metadata, menyamakan entity ID dan ACS URL, memetakan NameID dan atribut, lalu menguji assertion dan memperbaiki error yang paling sering muncul.
Satu hal yang menyenangkan dari SAML: hampir semua produk enterprise menyediakan opsi integrasi dengan identity provider eksternal. Yang paling sering ditemui:
| SP | Entity ID khas | ACS URL khas | Keterangan |
|---|---|---|---|
| Salesforce | https://salesforce.com atau instance org | URL .../_nc/external/security/.../IdpRedirect.jsp | Butuh certificate dari IdP |
| Google Workspace | Domain tujuan | URL callback yang diatur di admin | Dikonfigurasi lewat profile SSO |
| AWS | urn:amazon:webservices | https://signin.aws.amazon.com/saml | Dipakai untuk role mapping via SAML |
| Azure AD | Entity ID aplikasi | URL ACS aplikasi | Sering dipakai sebagai SP sekaligus IdP |
| Jira / Confluence | URL instance | URL instance ditambah path | Butuh SAML SSO licence |
Dasar dari setiap integrasi SAML adalah pertukaran metadata dua arah:
realms/demo/protocol/saml/descriptor dan mendaftarkannya di aplikasi.Dengan kedua metadata bertukar, kedua pihak otomatis tahu endpoint, kunci, dan binding lawannya. Potongan metadata SP kira-kira seperti ini:
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
entityID="https://jira.example.com">
<md:SPSSODescriptor AuthnRequestsSigned="true"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://jira.example.com/plugins/servlet/saml/consumer"
index="0" isDefault="true"/>
</md:SPSSODescriptor>
</md:EntityDescriptor>Dari metadata ini, Keycloak langsung bisa menyimpulkan entity ID, ACS URL, dan binding yang dipakai SP.
Saat mengonfigurasi SP (baik di Keycloak maupun di aplikasi), ada empat elemen yang harus cocok di kedua sisi:
| Elemen | Yang harus sama | Dampak bila salah |
|---|---|---|
| Entity ID | Identitas unik SP di kedua sisi | Assertion ditolak karena audience salah |
| ACS URL | Tempat SP menerima Response | Response tidak pernah sampai, error di SP |
| Name ID | Format identitas user yang disepakati | User dikenali sebagai identitas berbeda |
| Atribut | Nama atribut yang dipetakan | Aplikasi tidak menerima data yang dibutuhkan |
Entity ID adalah identitas yang dipakai Keycloak sebagai nilai audience dalam assertion. Di Keycloak, ini diisi di field Client ID saat membuat SAML client. Pastikan nilainya benar-benar identik dengan yang diharapkan SP — sering kali hanya beda satu huruf atau garis miring di belakang sudah cukup membuat integrasi gagal.
Assertion Consumer Service URL adalah alamat di aplikasi yang menerima Response dari browser. Saat membuat client di Keycloak, kalian menaruh ACS URL di Valid Redirect URIs. Bila SP mengirim URL tanpa tanda garis miring di akhir, kalian harus mendaftarkan dua variasi agar tidak gagal.
Setelah SP menerima assertion, aplikasi memetakan NameID ke akun internalnya. Karena itu format NameID harus konsisten — bila SP mengharapkan email, maka Name ID Format di client Keycloak harus email, dan assertion harus membawa alamat email yang cocok dengan akun di aplikasi.
Demikian juga atribut: SP seperti Salesforce sering meminta firstName, lastName, dan email dengan nama tertentu. Kalian membuat mapper di tab Mappers client SAML untuk setiap atribut, lalu menyesuaikan nama atribut SAML-nya persis seperti yang didokumentasikan SP.
Saat integrasi gagal, langkah pertama yang menolong adalah melihat assertion yang dikirim. Alat yang paling sering dipakai:
Langkah pengujian yang disarankan:
1. Aktifkan SAML Tracer di browser
2. Buka URL aplikasi (SP) lalu klik login
3. Telusuri alur redirect sampai halaman login Keycloak
4. Login dengan user yang benar
5. Di SAML Tracer, pilih permintaan Response terakhir
6. Periksa status, issuer, audience, NameID, dan atribut assertionPerhatikan: SAMLRequest dari SP muncul saat masuk, SAMLResponse dari IdP muncul saat kembali. Keduanya bisa dibaca mentah di SAML Tracer.
Saat memeriksa assertion, urutan validasinya:
Tip
Sebelum mengubah konfigurasi apa pun saat debugging, tangkap dulu assertion yang gagal dengan SAML Tracer. Satu dokumen XML yang utuh jauh lebih informatif daripada membaca log server secara acak.
| Error yang muncul | Penyebab umum | Solusi |
|---|---|---|
| Invalid signature | Kunci signing tidak sinkron | Impor ulang metadata IdP ke SP |
| Audience mismatch | Entity ID tidak cocok | Samakan audience dengan entity ID SP |
| NameID format salah | Format tidak disepakati | Set Name ID Format di client Keycloak |
| ACS URL tidak terdaftar | Redirect URI beda tipis | Tambahkan variasi URL dengan dan tanpa garis miring |
| Assertion expired | Selisih jam antar server | Sinkronkan NTP di semua host |
| Attribute tidak sampai | Nama atribut tidak cocok | Sesuaikan nama atribut di mapper dengan dokumentasi SP |
Catatan khusus tentang signature: setelah kalian memutar kunci signing di Keycloak, assertion yang lama ditandatangani kunci lama akan ditolak SP. Solusinya selalu sama — impor metadata IdP yang baru ke SP.
Pada episode 14 ini, kalian menyambungkan aplikasi nyata sebagai SAML service provider ke Keycloak: mengenal SP populer, bertukar metadata dua arah, menyamakan entity ID, ACS URL, NameID, dan atribut di kedua sisi, menguji alur dengan SAML Tracer, serta menangani error khas seperti signature invalid dan audience mismatch.
Inti yang harus dibawa pulang:
Di episode 15 berikutnya, kita beralih dari autentikasi ke penyimpanan identitas: user federation — menghubungkan Keycloak ke LDAP dan Active Directory agar user tidak perlu diduplikasi di setiap sistem.