Cara Kerja
Sebelum menulis kode, pahami tiga bagian utama integrasi ini. Halaman ini menjelaskan alur OAuth2, entry point package, dan batas keamanan yang perlu diterapkan.
Tiga bagian utama
Browser (React/Vue/Next) → Backend aplikasi → Frappe
user login simpan secret provider identity- Browser — tempat user menekan tombol login. Gunakan
sso-frappe/browser, atau biarkan backend mengelola redirect sepenuhnya. - Backend aplikasi — satu-satunya tempat
clientSecretboleh disimpan. Gunakansso-frappe/serveruntuk menukar authorization code dan mengambil profile. - Frappe — identity provider yang menyediakan halaman login, authorization code, dan profile user.
Alur langkah demi langkah
startLogin()membuatstateacak dan pasangan PKCE, menyimpannya disessionStorage, lalu mengarahkan browser ke Frappe.- User login dan memberikan persetujuan di Frappe.
- Frappe mengarahkan kembali ke
redirectUridengancodedanstate. handleCallback()membaca URL dan memvalidasistate.- Frontend mengirim
{ code, codeVerifier }ke backend. Jangan melakukan token exchange di browser. - Backend menjalankan
exchangeCode()menggunakanclientSecretdancodeVerifier. - Backend menjalankan
getUserProfile()untuk mengambil data user. - Aplikasi mencocokkan atau membuat user lokal. Rekomendasi: identity schema, yaitu
users+user_identities. - Aplikasi membuat session cookie atau JWT sendiri.
Entry point
| Import | Lingkungan | Kegunaan |
|---|---|---|
sso-frappe |
Semua | Types, validator config, error classes, validateState. |
sso-frappe/server |
Node.js / Nitro / Bun / Deno | Token exchange dan userinfo. Memegang clientSecret. |
sso-frappe/browser |
Browser SPA | State, PKCE, redirect, dan callback validation. Tidak memiliki clientSecret. |
sso-frappe/next-auth |
Next.js | Konfigurasi provider Auth.js v5. |
Aturan keamanan
clientSecrethanya boleh berada di backend. Jangan simpan diVITE_*,NEXT_PUBLIC_*, atau bundle browser.redirectUriharus sama persis dengan URL yang didaftarkan di Frappe.stateharus divalidasi pada callback untuk mencegah CSRF.- PKCE menggunakan
S256dan aktif secara default. id_tokenFrappe tidak digunakan; profile diambil melalui userinfo endpoint.
Tanggung jawab package dan aplikasi
| Tanggung jawab | Package | Aplikasi kamu |
|---|---|---|
| OAuth URL, state, PKCE | ✅ | |
| Token exchange dan normalisasi profile | ✅ | |
| User table dan migration | ✅ | |
| Match/create user | ✅ | |
| Role mapping dan status user | ✅ | |
| Session management | ✅ | |
| Tampilan tombol login | ✅ |
Selanjutnya: Setup Frappe Provider.