Nodeflux Central
Otentikasi

API Reference — Otentikasi

Endpoint login JWT, logout, dan manajemen API key (x-api-key) tingkat pengguna.

Endpoint Login (POST /api/auth/token) tidak memerlukan header Authorization — Anda belum memiliki token saat memanggil endpoint ini. Semua endpoint lain, termasuk logout dan seluruh manajemen API key, memerlukan header Authorization: Bearer <token>. Basis URL mengikuti variabel lingkungan VITE_API_URL yang dikonfigurasi pada instalasi Lenz.


Login & Token

Endpoint untuk memperoleh token akses (access_token) dan mengakhiri sesi. Login mendukung dua metode: username/password via JSON body, atau API key via header X-Api-Key — keduanya mengarah ke endpoint yang sama dan mengembalikan format respons yang identik.

Login — Dapatkan Token Akses

POST
/api/auth/token

Header Parameters

X-Api-Key?string

API key yang valid (untuk metode login via API key — abaikan jika menggunakan username/password)

Request Body

application/json

Kredensial login (wajib untuk metode username/password; abaikan untuk metode API key)

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://lenz.example.com/api/auth/token" \  -H "Content-Type: application/json" \  -d '{    "user_access": "[email protected]",    "password": "rahasia123"  }'
{  "ok": true,  "message": "success",  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20iLCJpYXQiOjE3NDYwMDAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsInR5cGUiOiJyZWZyZXNoIiwiaWF0IjoxNzQ2MDAwMDAwfQ.abc123def456ghi789",  "name": "Siti Rahayu"}
{  "ok": false,  "message": "invalid request"}

Logout — Akhiri Sesi

POST
/api/auth/logout

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Response Body

application/json

curl -X POST "https://lenz.example.com/api/auth/logout"
{  "success": true,  "message": "logout successful"}
Empty

API Keys

Endpoint untuk mengelola API key tingkat pengguna. API key berguna untuk integrasi service-to-service, skrip otomatis, dan CI/CD pipeline. Setelah API key dibuat atau diperbarui, nilai key rahasia hanya dikembalikan satu kali pada respons — simpan segera.

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

Daftar API Key

GET
/api/api-keys

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Query Parameters

page?integer

Nomor halaman, dimulai dari 1

Default1
limit?integer

Jumlah data per halaman

Default20
search?string

Pencarian berdasarkan nama API key

filter[status]?string

Filter berdasarkan status API key

Value in"active" | "inactive"

Response Body

application/json

curl -X GET "https://lenz.example.com/api/api-keys"
{  "ok": true,  "message": "success",  "results": {    "limit": 20,    "current_page": 1,    "total_data": 2,    "total_page": 1,    "api_keys": [      {        "id": 7,        "user_id": 42,        "name": "Integrasi CCTV Gedung A",        "status": "active",        "last_used_at": "2026-04-28T08:30:00Z",        "expires_at": "2027-04-30T00:00:00Z",        "created_by": 1,        "created_at": "2026-01-15T10:00:00Z",        "updated_at": "2026-04-01T09:00:00Z",        "username": "siti.rahayu",        "email": "[email protected]"      }    ]  }}

Buat API Key Baru

POST
/api/api-keys

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/api-keys" \  -H "Content-Type: application/json" \  -d '{    "name": "Integrasi CCTV Gedung B",    "expires_at": "2027-12-31T23:59:59Z"  }'
{  "ok": true,  "message": "success",  "api_key": {    "id": 9,    "user_id": 42,    "name": "Integrasi CCTV Gedung B",    "status": "active",    "key": "lenz_ak_4f8e2a1b3d7c9e0f5a2b6d8c1e4f7a3b",    "last_used_at": null,    "expires_at": "2027-12-31T23:59:59Z",    "created_by": 42,    "created_at": "2026-04-30T12:00:00Z",    "updated_at": "2026-04-30T12:00:00Z",    "username": "siti.rahayu",    "email": "[email protected]"  }}

Detail API Key

GET
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

ID numerik API key

Response Body

application/json

curl -X GET "https://lenz.example.com/api/api-keys/7"
{  "ok": true,  "message": "string",  "api_key": {    "id": 7,    "user_id": 42,    "name": "Integrasi CCTV Gedung A",    "status": "active",    "last_used_at": "2026-04-28T08:30:00Z",    "expires_at": "2027-04-30T00:00:00Z",    "created_by": 1,    "created_at": "2026-01-15T10:00:00Z",    "updated_at": "2026-04-01T09:00:00Z",    "username": "siti.rahayu",    "email": "[email protected]"  }}

Perbarui API Key

PUT
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

ID numerik API key

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X PUT "https://lenz.example.com/api/api-keys/7" \  -H "Content-Type: application/json" \  -d '{    "name": "Integrasi CCTV Gedung A — Diperbarui",    "expires_at": "2028-01-01T00:00:00Z"  }'
{  "ok": true,  "message": "string",  "api_key": {    "id": 7,    "user_id": 42,    "name": "Integrasi CCTV Gedung A",    "status": "active",    "last_used_at": "2026-04-28T08:30:00Z",    "expires_at": "2027-04-30T00:00:00Z",    "created_by": 1,    "created_at": "2026-01-15T10:00:00Z",    "updated_at": "2026-04-01T09:00:00Z",    "username": "siti.rahayu",    "email": "[email protected]",    "key": "lenz_ak_4f8e2a1b3d7c9e0f5a2b6d8c1e4f7a3b"  }}

Hapus API Key

DELETE
/api/api-keys/{id}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*integer

ID numerik API key

Response Body

application/json

curl -X DELETE "https://lenz.example.com/api/api-keys/7"
{  "ok": true,  "message": "success"}

Federation Headers

Dalam arsitektur multi-instance Lenz, header X-User-Permissions digunakan oleh Federation Module (Core) saat meneruskan request pengguna ke remote instance (backend) — bukan oleh integrator eksternal. Tidak ada endpoint khusus untuk alur ini; mekanisme ini terjadi otomatis di layer middleware backend.

Ketika Federation Module membuat request ke remote instance, dua header berikut selalu disertakan bersama-sama:

HeaderNilaiKeterangan
X-Api-KeyAPI key remote instance yang validMengotentikasi Federation Module ke remote instance
X-User-PermissionsJWT bertanda tangan HMAC-SHA256Membawa identitas dan izin pengguna yang sudah difilter

JWT X-User-Permissions ditandatangani menggunakan API key remote instance sebagai secret, sehingga remote instance dapat memvalidasi keasliannya tanpa perlu lookup ke database lokal. TTL JWT ini adalah 5 menit — Federation Module membuat JWT baru untuk setiap batch request.

On this page