Catatan Keamanan
Baca sebelum deploy. Sebagian besar sudah di-handle otomatis oleh package — tapi ada beberapa hal yang jangan pernah kamu lakukan.
clientSecret
Jangan pernah letakkan FRAPPE_SSO_CLIENT_SECRET di:
- Variable environment
VITE_*(Vite akan memasukkannya ke bundle browser) - Variable
NEXT_PUBLIC_*(Next.js akan mengembed-nya saat build) - File apapun yang diserve ke browser
- Kode client-side secara umum
Client browser (sso-frappe/browser) tidak menerima field clientSecret. Jika kamu mencoba mengirimkannya, TypeScript akan error.
redirectUri
Harus sama persis dengan yang didaftarkan di OAuth2 Settings Frappe:
| Terdaftar di Frappe | redirectUri di kode | Cocok? |
|---|---|---|
https://app.example.com/callback |
https://app.example.com/callback |
✅ |
https://app.example.com/callback |
http://app.example.com/callback |
❌ (protocol beda) |
https://app.example.com/callback |
https://app.example.com/callback/ |
❌ (trailing slash) |
https://app.example.com/callback |
https://app.example.com/api/auth/callback |
❌ (path beda) |
Jika tidak cocok, Frappe akan menolak authorization request dengan error redirect_uri mismatch.
State (CSRF)
Parameter state mencegah serangan CSRF, yaitu ketika attacker mengecoh browser menyelesaikan login flow yang bukan dimulainya sendiri.
sso-frappe/browsermembuat dan memvalidasi state secara otomatis.sso-frappe/servermenyediakanvalidateState()untuk flow yang dikelola backend.- Jika kamu membuat alur sendiri, selalu validasi state sebelum menerima code.
PKCE
PKCE (Proof Key for Code Exchange) mencegah pencurian authorization code. Meskipun seseorang berhasil mencuri code, code tersebut tidak bisa ditukar tanpa code_verifier.
- Selalu aktif (
S256) disso-frappe/browser. - Bisa diatur via
usePkcedisso-frappe/server(default:true). - Tidak ada alasan untuk menonaktifkannya di production.
Enforce HTTPS
Secara default, baseUrl dan redirectUri harus menggunakan https://. Jika kamu developing lokal dengan http://localhost:
createFrappeSSOBrowser({
baseUrl: 'http://localhost:8080',
allowInsecureHttp: true, // hanya local dev
});Setel FRAPPE_SSO_ALLOW_INSECURE_HTTP=true di .env untuk development lokal. Jangan enable di production.
Jangan gunakan
NODE_ENV !== 'production'untuk menentukan apakah insecure HTTP diperbolehkan — container Docker selalu setNODE_ENV=production. Gunakan env var eksplisit seperti di atas.
Session creation
Buat session aplikasi setelah user lokal terselesaikan, bukan sebelumnya. Urutannya:
- Tukar code → dapatkan access token
- Ambil profile dari Frappe
- Match/create user lokal (lihat identity schema)
- Cek user dalam status aktif
- Sekarang buat session
Jika session dibuat dulu dan lookup user gagal, kamu beresiko punya sesi terautentikasi untuk user yang tidak terdaftar.
Tokens
Package ini tidak menyimpan access/refresh tokens. Jika butuh memanggil API Frappe atas nama user:
- Simpan tokens di dedicated table (misal
frappe_tokens), jangan diuser_identities. - Encrypt tokens at rest.
- Jangan simpan tokens di cookies atau localStorage.