Arsitektur Konseptual DUMEG Identity
Halaman ini memaparkan arsitektur konseptual, model kepercayaan (trust boundaries), dan alur komunikasi teknis antara aplikasi dalam ekosistem Duta Meta Graha dengan DUMEG Identity.
1. Arsitektur Konseptual Ekosistem
DUMEG Identity bertindak sebagai penyedia identitas terpusat (Identity Provider / IdP) berbasis OpenID Connect (OIDC) dan OAuth 2.0. Seluruh komunikasi antarkomponen berjalan melalui protokol aman HTTPS.
flowchart TD
subgraph Klien["Pengguna & Klien"]
Browser["User Agent / Browser\n(Desktop & Mobile)"]
end
subgraph EkosistemAplikasi["Ekosistem Aplikasi DUMEG"]
AppLaravel["Aplikasi Backend (Laravel)\ne.g. sdm.dumeg.com"]
AppVue["Aplikasi Frontend (Vue.js)\ne.g. dashboard.dumeg.com"]
AppOther["Sistem Internal Lainnya\ne.g. finance.dumeg.com"]
end
subgraph LayananIdentitas["Layanan Identitas Terpusat"]
Keycloak["DUMEG Identity (IdP)\nhttps://login.dumeg.com\n(Realm: dumeg-internal)"]
Portal["Developer Portal\nhttps://identity.dumeg.com"]
end
Browser -->|"1. Mengakses Layanan Aplikasi"| EkosistemAplikasi
Browser -->|"2. Redirect Login Terpusat (HTTPS)"| Keycloak
Browser -->|"3. Membaca Panduan Integrasi"| Portal
AppLaravel -->|"Pertukaran Token OIDC Back-Channel (HTTPS)"| Keycloak
AppOther -->|"Pertukaran Token OIDC Back-Channel (HTTPS)"| KeycloakKomponen Layanan Publik
| Komponen | Domain Resmi | Peran & Tanggung Jawab |
|---|---|---|
| DUMEG Identity Provider | https://login.dumeg.com | Penyedia autentikasi terpusat (Keycloak Realm dumeg-internal), manajemen sesi Single Sign-On (SSO), penerbitan token JWT (ID Token & Access Token). |
| Developer Portal | https://identity.dumeg.com | Dokumentasi resmi, standar keamanan, arsitektur, dan referensi kode integrasi bagi pengembang aplikasi. |
| Aplikasi Klien (Relying Party) | Domain aplikasi masing-masing | Aplikasi web yang mengonsumsi layanan identitas DUMEG Identity melalui protokol OpenID Connect. |
2. Diagram Alur Autentikasi (Sequence Flow)
Berikut alur interaksi standar antara Browser pengguna, Aplikasi Klien, dan DUMEG Identity menggunakan Authorization Code Flow dengan PKCE S256:
sequenceDiagram
autonumber
actor User as Pengguna
participant Browser as Browser (User Agent)
participant Client as Aplikasi Klien (Laravel / Vue)
participant Keycloak as DUMEG Identity (Keycloak)
participant LocalDB as Database Lokal Aplikasi
User->>Browser: Klik tombol "Masuk via DUMEG Identity"
Browser->>Client: GET /auth/dumeg/login
Note over Client: 1. Generate code_verifier<br/>2. Hitung code_challenge (S256)<br/>3. Generate state & nonce<br/>4. Simpan di sesi server
Client-->>Browser: 302 Redirect ke https://login.dumeg.com/.../auth
Browser->>Keycloak: GET /realms/dumeg-internal/protocol/openid-connect/auth
Keycloak-->>Browser: Tampilkan Form Login DUMEG Identity
User->>Browser: Masukkan Kredensial Akun DUMEG
Browser->>Keycloak: POST Kredensial Pengguna
Note over Keycloak: Verifikasi Kredensial & Buat Sesi SSO Realm
Keycloak-->>Browser: 302 Redirect ke Callback Aplikasi dengan ?code=...&state=...
Browser->>Client: GET /auth/dumeg/callback?code=AUTH_CODE&state=RETURNED_STATE
Note over Client: 1. Validasi state == session(state)<br/>2. Ambil code_verifier dari sesi
Client->>Keycloak: POST /protocol/openid-connect/token<br/>(code, code_verifier, client_secret)
Note over Keycloak: Validasi hash PKCE & Signature Client
Keycloak-->>Client: Return Tokens: {id_token, access_token, refresh_token}
Note over Client: Validasi JWT ID Token:<br/>iss, aud, exp, nonce & signature JWKS
Client->>LocalDB: Cari user berdasarkan keycloak_id (sub)
alt User Sudah Pernah Terhubung
Client->>LocalDB: Ambil role & permissions lokal
else Email Terdaftar Namun Belum Terhubung
Note over Client: Account Linking Terverifikasi:<br/>Minta verifikasi password lokal (Anti-Hijacking)
else Pengguna Baru
Note over Client: JIT Provisioning:<br/>Insert user baru dengan default role terendah
end
Client-->>Browser: 302 Redirect ke Dashboard Aplikasi (Sesi Cookie Diterbitkan)
Browser->>User: Halaman Dashboard Ditampilkan3. Pemisahan Wewenang: Autentikasi vs Otorisasi
DUMEG Identity menerapkan prinsip arsitektur Separation of Concerns:
| Domain | Dikelola Oleh | Tanggung Jawab |
|---|---|---|
| Autentikasi (Identity Provider) | DUMEG Identity (Keycloak) | • Memverifikasi identitas pengguna (sub, email, nama).• Keamanan kredensial, proteksi brute-force, dan kebijakan password. • Manajemen sesi Single Sign-On (SSO) terpusat lintas aplikasi. • Deaktivasi akun karyawan nonaktif secara sentral. |
| Otorisasi (Application Domain) | Aplikasi Anda (Laravel / Vue / DB Lokal) | • Peran (Role) pengguna di aplikasi (e.g. Supervisor, Staff Gudang, Auditor). • Izin operasional (Permissions) fungsional. • Kepemilikan data dan pembatasan cabang/divisi. • Riwayat log transaksi dan audit trail bisnis. |
Keuntungan Pemisahan Ini
Jika tim pengembang aplikasi ingin menambahkan role baru atau mengubah permission suatu fitur, perubahan cukup dilakukan di database aplikasi lokal Anda tanpa memerlukan perubahan konfigurasi realm Keycloak dari tim infrastruktur.
4. Batas Keamanan Jaringan (Trust Boundaries)
Browser Runtime (Untrusted Zone):
- Beroperasi di lingkungan publik pengguna yang rentan terhadap inspeksi kode dan potensi serangan XSS.
- Aturan: Jangan pernah mengirimkan
client_secretke browser. Hindari menyimpan token sensitif dilocalStorage.
Perimeter Enkripsi (HTTPS / TLS):
- Seluruh endpoint identitas dan aplikasi dilindungi oleh enkripsi HTTPS dan sertifikat TLS yang valid. Komunikasi HTTP biasa tanpa enkripsi dilarang keras di lingkungan produksi.
Server-to-Server Back-Channel (Trusted Zone):
- Komunikasi langsung antara server aplikasi backend (Laravel) dan DUMEG Identity melalui endpoint token. Dilindungi oleh kombinasi
client_secretdan verifikasi hash PKCE.
- Komunikasi langsung antara server aplikasi backend (Laravel) dan DUMEG Identity melalui endpoint token. Dilindungi oleh kombinasi
Database Lokal Aplikasi (Isolated Zone):
- Database aplikasi lokal menyimpan tabel
usersdengan foreign referencekeycloak_id(UUID format). - Apabila koneksi IdP terganggu sesaat, sesi aktif yang sudah tersimpan di aplikasi tetap dapat beroperasi normal.
- Database aplikasi lokal menyimpan tabel