Sebelum produksi
Konfigurasi
- [ ] Alamat callback dan sesudah logout memakai
httpsdan sama persis dengan di konsol. - [ ] Client secret dan secret webhook hanya ada di konfigurasi server, bukan di repositori, kode browser, log, atau chat.
- [ ] Jam server tersinkron (selisih di bawah 1 menit).
- [ ] Server bisa membuka issuer lewat HTTPS dengan pemeriksaan sertifikat aktif (jangan pernah dimatikan).
Login
- [ ]
state,nonce, dan PKCE S256 dibuat acak per login dan diperiksa saat callback. - [ ] ID token diverifikasi: tanda tangan RS256,
iss,aud,exp,nonce. - [ ] Akun lokal ditautkan lewat
sub; tautan lewat email hanya bilaemail_verified. - [ ] Tujuan sesudah login (
next,returnTo) hanya boleh path di aplikasi sendiri, supaya tidak bisa dipakai mengalihkan pengguna ke situs lain. - [ ] Galat callback dipercaya hanya bila
statecocok;access_deniedmenampilkan pesan, bukan mengulang login. - [ ] Sesi aplikasi dibuat baru sesudah login (ID sesi diganti), supaya ID sesi yang ditanam orang lain tidak berguna.
Logout dan sesi
- [ ] Logout menghapus sesi lokal lalu mengalihkan ke
end_sessiondenganid_token_hint. - [ ] Back-channel logout dipasang (aplikasi dengan alamat publik), atau login senyap berkala (aplikasi tanpa alamat publik), supaya logout di aplikasi lain ikut terasa.
Webhook (bila dipakai)
- [ ] Tanda tangan dihitung atas body mentah dan dibandingkan waktu-konstan.
- [ ] Timestamp lebih dari 5 menit ditolak.
- [ ]
idevent yang sudah diproses diabaikan, tetap dijawab 2xx. - [ ] Uji kirim di konsol menunjukkan Terkirim.
Uji akhir
- Login, lalu buka aplikasi organisasi yang lain: masuk tanpa password.
- Logout di aplikasi lain: aplikasi ini ikut keluar.
- Admin menonaktifkan akun uji: login ditolak, sesi berakhir (seketika lewat webhook, atau pada pemeriksaan berikutnya).
- Admin membatasi akses aplikasi ke pengguna lain: akun uji ditolak dengan pesan akses.