Nodeflux Central

Otentikasi

Panduan JWT, API key, dan header federation untuk integrasi dengan Raisa Gateway.

Pengenalan

Raisa Gateway 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 satu dari keduanya. Untuk arsitektur multi-instance (federation), terdapat mekanisme tambahan berupa header X-User-Permissions yang memungkinkan Federer meneruskan konteks izin pengguna ke Remote secara aman.

Halaman ini mencakup seluruh alur otentikasi secara teknis — mulai dari cara mendapatkan token, cara menyertakannya di setiap request, hingga alur federation antar-instance Raisa.

Jika Anda hanya operator yang memakai dashboard Lenz, baca Memulai. Halaman ini lebih dalam dan ditujukan untuk integrator yang memanggil API langsung dari aplikasi atau skrip mereka.

Tipe Otentikasi

TipeHeader yang DipakaiUse Case
Bearer Token (JWT)Authorization: Bearer <jwt>Login sesi pengguna
API KeyX-Api-Key: <key>Service-to-service / automasi / CI-CD
FederatedX-Api-Key: <remote_key> + X-User-Permissions: <jwt>Federer → Remote (multi-instance)

Login Cepat (Untuk Operator)

Jika Anda hanya perlu masuk ke dashboard Lenz, buka browser dan kunjungi alamat Lenz yang sudah dikonfigurasi oleh 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.

Login dengan username dan password
curl -X POST "${RAISA_API_URL}/api/auth/token" \
  -H "Content-Type: application/json" \
  -d '{
    "user_access": "[email protected]",
    "password": "your-password"
  }'

Terima respons berisi token

Jika kredensial valid, server mengembalikan objek JSON berikut:

Respons login berhasil
{
  "ok": true,
  "message": "success",
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "name": "Admin Utama"
}

Simpan nilai access_token — Anda akan membutuhkannya di setiap request berikutnya.

Field name berisi nama tampilan pengguna. Untuk mendapatkan detail profil lengkap (role, permissions, email), gunakan endpoint GET /api/account/profile setelah login.

Sertakan access_token di setiap request

Kirimkan token di header Authorization dengan format Bearer <token>:

Request dengan Bearer Token
curl "${RAISA_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 yang tidak memiliki konteks pengguna interaktif. API key dibuat oleh admin melalui menu Configuration → API Key di dashboard Lenz.

Untuk mendapatkan access_token menggunakan API key, kirim request POST /api/auth/token tanpa body, namun sertakan header X-Api-Key:

Login dengan API key
curl -X POST "${RAISA_API_URL}/api/auth/token" \
  -H "X-Api-Key: YOUR_API_KEY_HERE"

Server akan mengembalikan respons dalam format yang sama dengan login username/password. Gunakan access_token yang dikembalikan untuk request selanjutnya dengan cara yang sama — header Authorization: Bearer <token>.

Jangan pernah menyimpan API key secara langsung di source code atau commit ke repository publik. Simpan di environment variable, secret manager (seperti Vault atau AWS Secrets Manager), atau file .env yang masuk ke dalam .gitignore.


Verifikasi Token

Untuk memastikan apakah token yang Anda miliki masih berlaku, kirim request GET /api/account/profile. Endpoint ini juga mengembalikan data profil pengguna yang sedang aktif.

Verifikasi token aktif
curl "${RAISA_API_URL}/api/account/profile" \
  -H "Authorization: Bearer ${TOKEN}"
  • HTTP 200 — Token valid. Body respons berisi data profil pengguna.
  • HTTP 401 — Token tidak valid atau sudah kedaluwarsa. Pengguna perlu login ulang.

Refresh Token

Raisa Gateway mengembalikan refresh_token saat login, namun saat ini tidak tersedia endpoint khusus untuk menukar refresh token menjadi access token baru. Jika access_token tidak lagi valid (respons 401), pengguna atau layanan harus melakukan login ulang menggunakan kredensial atau API key.

Token tidak memiliki durasi kedaluwarsa berbasis waktu yang kaku. Sesi pengguna berakhir karena idle timeout (dikonfigurasi oleh admin) atau karena logout eksplisit. Jika Anda menerima 401 pada request normal, lakukan login ulang untuk mendapatkan token baru.


Header Federation: X-User-Permissions

Dalam arsitektur multi-instance Lenz, terdapat satu node Federer (Core) yang berperan sebagai aggregator, dan satu atau lebih node Remote (instance Raisa Gateway tambahan). Ketika Federer meneruskan request pengguna ke sebuah Remote, ia tidak menggunakan Bearer Token pengguna secara langsung. Sebagai gantinya, Federer:

  1. Mengautentikasi dirinya ke Remote menggunakan API key Remote (X-Api-Key).
  2. Mengemas informasi pengguna dan izin yang sudah difilter ke dalam sebuah JWT baru.
  3. Menandatangani JWT tersebut menggunakan API key Remote sebagai HMAC secret.
  4. Menyertakan JWT tersebut di header X-User-Permissions.

Remote kemudian memvalidasi tanda tangan JWT menggunakan API key-nya sendiri, mengekstrak izin pengguna, dan menjalankan access control berbasis data JWT — tanpa perlu melakukan lookup role ke database lokalnya.

Authorization: Bearer <user_jwt> Validasi token, ambil profil & permissions user Filter permissions untuk target Remote Sign JWT baru pakai API key Remote (HMAC-SHA256) X-Api-Key: <remote_key>X-User-Permissions: <signed_jwt> Validasi X-Api-Key Validasi signature JWT pakai API key yang sama Ekstrak user info + permissions dari JWT Terapkan access control (site/stream level) Response sesuai permissions user Agregasi response dari semua Remote User Federer (Core) Remote (Raisa)

Struktur Payload JWT X-User-Permissions

Payload JWT X-User-Permissions
{
  "sub": "federrer:123",
  "email": "[email protected]",
  "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
}
FieldDeskripsi
subSubject identifier dalam format "federrer:{user_id}"
emailAlamat email pengguna
role_id / role_nameNama role (bukan ID database)
permissionsIzin pengguna yang sudah difilter untuk Remote target, dengan key diubah menjadi [remote]core
iat / expTimestamp issued-at dan expiration (TTL 5 menit)

Header X-User-Permissions hanya boleh dikirim oleh Federer yang sudah terdaftar dan memiliki API key Remote 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.


Logout

Untuk merevoke token dan mengakhiri sesi, kirim request POST /api/auth/logout dengan menyertakan token aktif di header:

Logout dan revoke token
curl -X POST "${RAISA_API_URL}/api/auth/logout" \
  -H "Authorization: Bearer ${TOKEN}"

Setelah logout berhasil, token tidak bisa digunakan lagi untuk request berikutnya.


Pesan Error Umum


API Reference

POST /api/auth/token

Mengotentikasi pengguna dan mengembalikan token akses.

Login dengan username/password:

ParameterLokasiTipeWajibDeskripsi
user_accessBody (JSON)stringYaUsername atau alamat email
passwordBody (JSON)stringYaKata sandi

Login dengan API key:

HeaderTipeWajibDeskripsi
X-Api-KeystringYaAPI key yang valid

Respons berhasil (HTTP 200):

Respons POST /api/auth/token
{
  "ok": true,
  "message": "success",
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "name": "Nama Pengguna"
}
FieldTipeDeskripsi
okbooleantrue jika login berhasil
messagestringPesan status
access_tokenstringJWT untuk digunakan di header Authorization: Bearer
refresh_tokenstringToken untuk keperluan refresh (saat ini disimpan di client)
namestringNama tampilan pengguna

Error:

HTTP StatusKondisi
401Kredensial tidak valid atau API key tidak ditemukan

POST /api/auth/logout

Merevoke token aktif dan mengakhiri sesi pengguna.

HeaderTipeWajibDeskripsi
AuthorizationstringYaBearer <access_token>

Respons berhasil (HTTP 200):

Respons POST /api/auth/logout
{
  "success": true,
  "message": "logout successful"
}

GET /api/account/profile

Mengembalikan profil pengguna yang sedang aktif. Digunakan juga untuk memverifikasi apakah token masih valid.

HeaderTipeWajibDeskripsi
AuthorizationstringYaBearer <access_token>

Respons berhasil (HTTP 200): Data profil pengguna lengkap termasuk role dan permissions.

Error:

HTTP StatusKondisi
401Token tidak valid atau sudah kedaluwarsa

Struktur respons detail dari /api/account/profile dapat bervariasi tergantung konfigurasi role dan permissions. Untuk melihat struktur aktual di lingkungan Anda, gunakan tab Network di DevTools browser saat membuka dashboard Lenz.


Tips Integrasi

Best practice untuk integrator:

  • Simpan access_token di memori aplikasi atau secure storage — hindari menyimpan di localStorage yang dapat diakses JavaScript publik jika memungkinkan.
  • Implementasikan handler untuk respons 401: tangkap error ini dan arahkan pengguna ke alur login ulang secara otomatis.
  • Untuk integrasi service-to-service, gunakan API key dan rotasi secara berkala sesuai kebijakan keamanan organisasi Anda.
  • Untuk federated requests, perhatikan TTL JWT X-User-Permissions yang hanya 5 menit — Federer akan membuat JWT baru untuk setiap batch request.
  • Jangan hardcode token atau API key di kode sumber. Gunakan environment variable atau secret manager.

Selanjutnya

On this page