Integration Checklist
Gunakan checklist ini sebelum go-live integrasi client SSO. Halaman ini merangkum prasyarat yang tersebar di onboarding, API reference, scope/claim, dan framework guides.
1. Registrasi Client
- [ ] Pilih tipe client yang benar: public untuk SPA/mobile, confidential untuk app dengan backend/BFF.
- [ ] Daftarkan
redirect_uriexact match: skema, host, port, path, slash akhir harus identik. - [ ] Gunakan client development dan production terpisah.
- [ ] Simpan
client_secrethanya untuk confidential client, sekali tampil → vault/env server. Jangan commit. Detail → Onboarding. - [ ] Minta scope minimal yang benar:
openidwajib; tambahprofile,email,offline_access,roles,permissionshanya bila perlu.
2. Discovery dan Endpoint
- [ ] Ambil metadata dari
/.well-known/openid-configurationsaat boot atau deploy. - [ ] Cache
authorization_endpoint,token_endpoint,jwks_uri,userinfo_endpoint,revocation_endpoint,end_session_endpoint. - [ ] Jangan menebak atau hardcode path endpoint bila bisa memakai discovery. Detail → API Reference.
3. Authorize Request
- [ ] Gunakan Authorization Code Flow.
- [ ] PKCE
S256aktif untuk semua client, termasuk confidential. - [ ] Hasilkan
statedannonceacak per login. - [ ] Simpan
code_verifierdengan aman sampai callback. - [ ]
openidada di scope request.
4. Token Exchange
- [ ] Tukar authorization code di
token_endpoint. - [ ] Confidential client mengirim
client_secrethanya dari server. - [ ] Kirim
code_verifieryang sama dengan authorize request. - [ ]
redirect_urisaat exchange identik dengan authorize request. - [ ] Anggap authorization code sekali pakai dan berumur pendek.
5. Verifikasi id_token
- [ ] Verifikasi signature via JWKS dengan algoritma signing provider (ES256).
- [ ] Validasi
issterhadap issuer discovery. - [ ] Validasi
aud=client_iduntukid_token. - [ ] Validasi
exp/nbfdan atur leeway clock-skew kecil. - [ ] Validasi
nonceterhadap nilai yang disimpan saat authorize. - [ ] Jangan tertukar:
id_tokenuntuk login lokal,access_tokenuntuk memanggil resource server.
6. Identity dan RBAC
- [ ] Gunakan
subsebagai identitas stabil user, bukan email. - [ ] Jika butuh RBAC, minta scope
rolesdan/ataupermissions. - [ ] Baca claim
roles[]/permissions[](array), bukanrolesingular. - [ ] Pastikan scope opsional masuk allow-list client di admin panel. Detail → Scopes and Claims.
7. Session, Refresh, Logout
- [ ] Simpan refresh token terenkripsi server-side; hindari penyimpanan browser kecuali benar-benar public SPA dengan threat review.
- [ ] Rotasi refresh token secara atomik; cegah parallel refresh replay.
- [ ] RP-initiated logout memakai
end_session_endpoint//connect/logoutdenganid_token_hintdanpost_logout_redirect_uriyang terdaftar. - [ ] Jika memakai back-channel logout, pastikan endpoint app benar-benar menghapus session lokal.
8. Header Account Bar Opsional
- [ ] Untuk app web eksternal, sediakan mount point header seperti
<div id="sso-account"></div>. - [ ] Tambahkan 1 baris widget (loader iframe — atribut lain pada tag script diabaikan; tanpa
data-mount, loader mencari elemen bertandadata-sso-account):
html
<script src="https://sso.timeh.my.id/widget/account.js" data-mount="#sso-account"></script>- [ ] Loader menyisipkan
<iframe>darisso.timeh.my.id/embed/account-baryang me-render account bar asli dan otomatis membesar/mengecil saat panel dibuka. Semua panggilan/widget/*terjadi di dalam iframe — halaman host tidak memanggil endpoint widget. - [ ] Pastikan
app_base_urlclient adalah URL webhttps://atau localhost development; linkjavascript:dandata:tidak akan ditampilkan. - [ ] Pastikan origin yang meng-embed disetujui eksplisit (origin first-party SSO atau client trusted untuk widget CORS). Allow-list yang sama dipakai sebagai
frame-ancestorsCSP di halaman embed — origin yang tidak disetujui ditolak browser saat mem-frame.app_base_urlsaja tidak otomatis cukup, dan allow-list ini tidak memakai redirect URI. - [ ] Jika memakai CSP ketat, izinkan origin SSO pada
script-src(loaderaccount.js) danframe-src/child-src(iframe/embed/account-bar).connect-srcdanstyle-srctidak diperlukan lagi. - [ ] Jangan mencoba membaca cookie widget dari JavaScript. Multi-account chooser memakai cookie device httpOnly dan registry server-side.
- [ ] Jangan panggil endpoint native
/api/auth/*,/api/profile/*, atau/api/mfa/*dari app eksternal. Endpoint mutasi itu khusus browser first-party dan wajib membawaOrigin/Referertepercaya sertaX-Requested-With: XMLHttpRequest; app eksternal memakai OIDC dan/widget/*.
9. Dev vs Production
- [ ]
http://localhosthanya untuk development. - [ ] HTTPS wajib untuk environment live.
- [ ] Redirect URI, post-logout URI, dan logout hooks production didaftarkan terpisah dari development.
- [ ] Logging/troubleshooting tidak pernah mencetak token atau secret.
10. Smoke Test Sebelum Go-Live
- [ ] Login berhasil → redirect ke callback exact match.
- [ ] State/nonce mismatch ditolak.
- [ ] Code exchange kedua kali gagal seperti yang diharapkan.
- [ ]
id_tokentervalidasi penuh sebelum session lokal dibuat. - [ ] Refresh berhasil dan token lama tidak bisa direuse.
- [ ] Logout menghapus session lokal dan sesi SSO.
- [ ] Widget account bar, bila dipakai, hanya menampilkan aplikasi yang user berhak akses dan akun yang terikat browser ini.
- [ ] Tidak ada token/secret di URL, bundle frontend, browser storage yang dilarang, atau support ticket.