sfsso-frappe

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/browser membuat dan memvalidasi state secara otomatis.
  • sso-frappe/server menyediakan validateState() 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) di sso-frappe/browser.
  • Bisa diatur via usePkce di sso-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 set NODE_ENV=production. Gunakan env var eksplisit seperti di atas.

Session creation

Buat session aplikasi setelah user lokal terselesaikan, bukan sebelumnya. Urutannya:

  1. Tukar code → dapatkan access token
  2. Ambil profile dari Frappe
  3. Match/create user lokal (lihat identity schema)
  4. Cek user dalam status aktif
  5. 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 di user_identities.
  • Encrypt tokens at rest.
  • Jangan simpan tokens di cookies atau localStorage.