WordPress Auth
Detail modul wordpress_auth.py - verifikasi JWT WordPress, sinkronisasi user, multi-site isolation.
WordPress Auth
Source:
backend/app/services/wordpress_auth.pyRouter:backend/app/routers/wordpress.pyLihat juga: Integrasi → Sejoli Tryout, Integrasi → Multi-Tenant
Tanggung Jawab
Modul wordpress_auth.py adalah gerbang autentikasi tunggal antara aplikasi dan WordPress:
- Verifikasi JWT token WordPress via REST API
- Sinkronisasi user dari WordPress ke database lokal
- Extract & normalisasi identitas user (email, username, display_name)
- Validasi
website_iduntuk multi-tenant isolation
Endpoint
Didefinisikan di backend/app/routers/wordpress.py dengan prefix /wordpress:
Verifikasi Token
Sequence Verifikasi
sequenceDiagram
autonumber
participant Client
participant App
participant WP as WordPress REST API
Client->>App: POST /wordpress/verify_session
Note over Client,App: body: wp_user_id, token, website_id
App->>App: Cek website_id di DB lokal
alt website_id tidak ada
App-->>Client: 404 WebsiteNotFoundError
end
App->>WP: GET /wp-json/wp/v2/users/me
Note over App,WP: Authorization: Bearer {token}
alt token invalid/expired
WP-->>App: 401 Unauthorized
App-->>Client: WordPressTokenInvalidError
else rate limited
WP-->>App: 429 Too Many Requests
App-->>Client: WordPressRateLimitError
else success
WP-->>App: 200 { id, email, name, roles, ... }
App->>App: Verify response.id == wp_user_id
alt ID match
App-->>Client: App access token + user_info
else ID mismatch
App-->>Client: None (silent reject)
end
end
HTTP Error Mapping
Data Class
WordPressUserInfo
Hasil verifikasi token:
SyncStats
Hasil sinkronisasi batch:
Normalisasi Identitas
Tiga helper untuk menjaga konsistensi identitas user:
Kenapa normalisasi penting?
- Email lowercase — hindari duplikat user akibat case beda (
[email protected]vs[email protected]) - Strip whitespace — hindari user berbeda karena typo spasi
- Multi-field fallback — WordPress API beda versi punya schema response beda
Sinkronisasi User
Algoritma Upsert
- Fetch existing users dari DB lokal → cache di dict
{wp_user_id: User} - Paginate fetch dari WP API (
per_page=100):GET /wp-json/wp/v2/users?page=1&per_page=100&context=edit
- Untuk setiap WP user:
- Existing →
apply_user_identity()update field yang berubah - New → buat
Userbaru dengan identitas dari WP
- Existing →
- Commit transaction
- Return
SyncStats(inserted, updated, errors)
Strategi Anti-Duplikat
- Unique constraint:
(wp_user_id, website_id)— tidak bisa ada user sama di website sama - Identitas di-update via
apply_user_identity()yang hanya tulis field yang berubah (returnchanged: bool)
Role Mapping
WordPress roles dipetakan ke API roles internal:
Dipakai oleh route authorization untuk menentukan hak akses endpoint (mis. /ai/generate butuh role admin).
Helper Functions
Configuration
Di app/core/config.py (Settings):
Security Considerations
- Token tidak disimpan di DB — hanya dipakai untuk satu request verifikasi
- App access token hasil verifikasi dipakai sebagai
Authorization: Beareruntuk endpoint/session/* - Admin token untuk sync_users harus punya kapabilitas
list_usersdi WP - CORS WordPress REST API harus whitelist URL app
- SSL wajib di production (
site_urlharushttps://)
Edge Cases
Dependency
httpxasync HTTP clientsqlalchemyasync session- Model:
Website,User
Bacaan Lanjutan
- Integrasi → Sejoli Tryout — alur integrasi end-to-end
- Integrasi → Multi-Tenant — isolasi data per website
- API → Session — endpoint yang konsumsi user hasil verifikasi
- Operasional → Konfigurasi — env vars terkait
Last updated Jul 25, 2026