Otentikasi
Panduan JWT, API key, refresh token, dan header X-User-Permissions untuk integrasi dengan backend API.
Pengenalan
Backend API mendukung dua mekanisme otentikasi utama: Bearer Token (JWT) yang diperoleh dari login username/password, dan API Key untuk kebutuhan service-to-service atau automasi. Setiap request ke API harus menyertakan salah satunya. Untuk arsitektur multi-instance (federation), terdapat mekanisme tambahan berupa header X-User-Permissions yang memungkinkan Federation Module meneruskan konteks izin pengguna ke remote instance secara aman tanpa harus replay JWT user asli.
Halaman ini mencakup seluruh alur otentikasi secara teknis — dari cara mendapatkan token, cara menyertakannya di setiap request, hingga alur federation antar-instance backend.
Jika Anda hanya operator yang memakai dashboard Lenz, baca Memulai. Halaman ini ditujukan untuk integrator yang memanggil API langsung dari aplikasi atau skrip mereka.
Tipe Otentikasi
| Tipe | Header yang Dipakai | Use Case |
|---|---|---|
| Bearer Token (JWT) | Authorization: Bearer <jwt> | Sesi pengguna login |
| API Key | X-Api-Key: <key> | Service-to-service / automasi / CI-CD |
| Federated | X-Api-Key: <remote_key> + X-User-Permissions: <jwt> | Federation Module → remote instance (multi-instance) |
Nama header X-Api-Key bersifat case-insensitive sesuai HTTP spec. Klien Lenz internal mengirim header dengan huruf kecil (x-api-key) — keduanya valid.
Login Cepat (Untuk Operator)
Jika Anda hanya perlu masuk ke dashboard Lenz, buka browser dan kunjungi alamat Lenz yang sudah dikonfigurasi admin Anda. Masukkan username dan password pada halaman login — tidak diperlukan konfigurasi tambahan.
Login dengan Username & Password
Kirim kredensial ke /api/auth/token
Gunakan field user_access untuk username atau alamat email, dan password untuk kata sandi.
curl -X POST "${API_URL}/api/auth/token" \
-H "Content-Type: application/json" \
-d '{
"user_access": "admin@example.com",
"password": "your-password"
}'const res = await fetch(`${API_URL}/api/auth/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
user_access: "admin@example.com",
password: "your-password",
}),
});
const { access_token, refresh_token, name } = await res.json();import requests
res = requests.post(
f"{API_URL}/api/auth/token",
json={"user_access": "admin@example.com", "password": "your-password"},
timeout=10,
)
data = res.json()
access_token = data["access_token"]Terima respons berisi token
Jika kredensial valid, server mengembalikan objek JSON berikut:
{
"ok": true,
"message": "success",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"name": "Admin Utama"
}Simpan nilai access_token — Anda akan membutuhkannya di setiap request berikutnya. refresh_token saat ini disimpan klien tetapi tidak ada endpoint khusus untuk menukarnya menjadi access token baru (lihat bagian Refresh Token).
Field name berisi nama tampilan pengguna. Untuk mendapatkan detail profil lengkap (role, permissions, email, default homepage), gunakan GET /api/account/profile dan GET /api/account/role setelah login.
Sertakan access_token di setiap request
Kirim token di header Authorization dengan format Bearer <token>:
curl "${API_URL}/api/streams" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Login dengan API Key
API key cocok untuk integrasi backend, skrip otomatis, CI/CD pipeline, atau layanan tanpa konteks pengguna interaktif. API key dibuat oleh admin di Administration → Configuration → API Key pada dashboard Lenz.

Untuk mendapatkan access_token menggunakan API key, kirim POST /api/auth/token tanpa body, namun sertakan header X-Api-Key:
curl -X POST "${API_URL}/api/auth/token" \
-H "X-Api-Key: YOUR_API_KEY_HERE"Server mengembalikan respons dalam format yang sama dengan login username/password. Gunakan access_token yang dikembalikan dengan cara yang sama — header Authorization: Bearer <token>.
Anda juga dapat memakai API key langsung di setiap request dengan header X-Api-Key, tanpa terlebih dahulu menukarnya dengan access_token. Mode ini lebih sederhana untuk skrip pendek; mode token lebih hemat ketika satu integrasi melakukan banyak request berurutan.
Jangan menyimpan API key langsung di source code atau commit ke repository publik. Simpan di environment variable, secret manager (Vault, AWS Secrets Manager, GCP Secret Manager), atau file .env yang sudah masuk .gitignore.
Verifikasi Token
Untuk memastikan token masih berlaku, kirim GET /api/account/profile. Endpoint ini juga mengembalikan profil lengkap pengguna aktif.
curl "${API_URL}/api/account/profile" \
-H "Authorization: Bearer ${TOKEN}"- HTTP 200 — Token valid. Body berisi data profil pengguna.
- HTTP 401 — Token tidak valid atau kedaluwarsa. Pengguna perlu login ulang.
Anda tidak perlu menyertakan header tambahan saat memanggil endpoint ini dari integrasi pihak ketiga.
Refresh Token
Backend API mengembalikan refresh_token saat login. Saat ini tidak ada endpoint khusus untuk menukar refresh token menjadi access token baru — lapangan tersebut diisi untuk kompatibilitas masa depan dan disimpan klien.
Jika access_token tidak lagi valid (respons 401), pengguna atau layanan harus login ulang menggunakan kredensial atau API key.
Token Lenz tidak memakai durasi kedaluwarsa berbasis waktu yang kaku. Sesi pengguna berakhir karena idle timeout (default 30 menit), absolute timeout (default 8 jam), atau logout eksplisit. Idle/absolute timeout dikonfigurasi admin di Preferences. Untuk integrator, tangani 401 sebagai sinyal untuk login ulang.
Logout
Untuk merevoke token dan mengakhiri sesi, kirim POST /api/auth/logout dengan token aktif di header:
curl -X POST "${API_URL}/api/auth/logout" \
-H "Authorization: Bearer ${TOKEN}"Setelah logout berhasil, token tidak bisa dipakai lagi untuk request berikutnya. Klien Lenz menambahkan ini ke alur logout otomatis (idle timeout, absolute timeout, dan tombol Logout di dashboard).
Header Federation: X-User-Permissions
Dalam arsitektur multi-instance Lenz, ada satu Federation Module (Core) yang berperan sebagai aggregator, dan satu atau lebih remote instance (instance backend tambahan). Saat Federation Module meneruskan request pengguna ke remote instance, ia tidak menggunakan Bearer Token pengguna secara langsung. Sebagai gantinya, Federation Module:
- Mengautentikasi dirinya ke remote instance menggunakan API key remote instance (
X-Api-Key). - Mengemas informasi pengguna dan izin yang sudah difilter ke dalam JWT baru.
- Menandatangani JWT tersebut menggunakan API key remote instance sebagai HMAC secret.
- Menyertakan JWT tersebut di header
X-User-Permissions.
Remote instance kemudian memvalidasi tanda tangan JWT menggunakan API key-nya sendiri, mengekstrak izin pengguna, dan menjalankan access control berbasis data JWT — tanpa perlu lookup role ke database lokalnya.
Struktur Payload JWT X-User-Permissions
{
"sub": "federrer:123",
"email": "user@example.com",
"role_id": "operator-role",
"role_name": "operator-role",
"permissions": {
"[remote]core": {
"site_id|1": ["stream-abc", "stream-def"],
"site_id|2": ["*"],
"no_site": ["stream-xyz"]
}
},
"iat": 1705123456,
"exp": 1705123756
}| Field | Deskripsi |
|---|---|
sub | Subject identifier dalam format "federrer:{user_id}" |
email | Alamat email pengguna |
role_id / role_name | Nama role (bukan ID database) |
permissions | Izin pengguna yang sudah difilter untuk remote instance target, dengan key diubah menjadi [remote]core |
iat / exp | Timestamp issued-at dan expiration (TTL 5 menit) |
Header X-User-Permissions hanya boleh dikirim oleh Federation Module yang sudah terdaftar dan memiliki API key remote instance yang valid. Jangan gunakan header ini untuk integrasi pihak ketiga — request semacam itu akan ditolak karena JWT tidak akan bisa divalidasi tanpa API key yang tepat sebagai secret HMAC.
Skenario Tanpa API Key Remote Instance (Mode Internal)
Jika Federation Module dijalankan satu cluster dengan remote instance dan tidak ingin pakai API key, secret JWT default PERMISSIONS_JWT_SECRET (env var) digunakan oleh kedua sisi. Mode ini tidak direkomendasikan untuk produksi karena tidak memberi isolasi per instance — bocornya secret di satu tempat berarti seluruh cluster terkompromi.
Pesan Error Umum
Tips Integrasi
Best practice untuk integrator:
- Simpan
access_tokendi memori aplikasi atau secure storage — hindarilocalStoragementah jika memungkinkan. - Implementasikan handler
401: tangkap error ini, hapus token lokal, lalu arahkan pengguna ke alur login ulang otomatis. - Gunakan API key terpisah per integrasi, dan rotasi berkala sesuai kebijakan keamanan organisasi Anda.
- Untuk federated requests, perhatikan TTL JWT
X-User-Permissionsyang hanya 5 menit — Federation Module membuat JWT baru untuk setiap batch request. - Jangan hardcode token atau API key di kode sumber. Gunakan environment variable atau secret manager.
- Saat federation aktif, sertakan parameter
instancedi setiap request ke endpoint yang scope-nya per-instance, agar data tidak tercampur.