Autentikasi dan otorisasi
Autentikasi memastikan siapa yang masuk. Otorisasi menentukan tindakan dan resource yang boleh diakses akun tersebut.
Autentikasi aktual
src/lib/auth/session.ts membuat token acak dan menyimpan hash SHA-256 di tabel sesi. Browser menerima cookie makarya_session dengan atribut HttpOnly dan SameSite=Lax; pada production, cookie juga memakai Secure. Sesi memiliki masa berlaku. Login baru menggantikan sesi sebelumnya.
getCurrentUser membaca sesi dari cookie. requireRole dan requireAnyRole melindungi layout serta halaman, lalu mengarahkan pengguna ke workspace yang sesuai. src/lib/auth/password.ts menangani password.
Rencana awal menyebut Better Auth. Kode sekarang mengelola sesi Makarya sendiri; Better Auth tidak terpasang.
Otorisasi resource
Peran di sesi saja tidak cukup. Setiap command dan query memeriksa organisasi, grant aktif, kepemilikan kandidat, serta penugasan verifier yang terkait. HR hanya dapat membaca kandidat di organisasinya. Verifier harus mendapat penugasan; mengetahui ID assessment saja tidak memberi akses.
UI hanya menampilkan tindakan yang relevan. Server tetap memeriksa izin pada request langsung, tombol tersembunyi, URL yang diketik manual, dan request yang diulang.
Berbagi publik
Profil skill memakai token yang terpisah dari sesi. Selama aktif, token hanya membuka field yang dipilih pemilik profil. Token ini tidak bisa dipakai untuk login, membuka semua Karya, atau mengubah assessment.
Preferensi browser
Onboarding menyimpan nilai seen di makarya:onboarding:candidate:v1 atau makarya:onboarding:company:v1. Preferensi ini berlaku per browser, bukan per akun. Menghapusnya hanya menampilkan tur lagi; izin akun tetap sama.
Lihat keamanan dan tests/security/authorization-boundary.test.ts.