Auth System Behavior
1. System Behavior
1.1 Tujuan Context
Context packages/lib/src/auth menyediakan autentikasi request berbasis Bearer token untuk route API yang memakai guard NestJS.
Implementasi utama:
packages/lib/src/auth/datacore-jwt/datacore-jwt.guard.tspackages/lib/src/auth/datacore-token/datacore-token.service.ts
1.2 Scope
Termasuk dalam scope context ini:
- Validasi format header
Authorization: Bearer <token>. - Verifikasi token via JWT (
HS256) menggunakanprocess.env.SECRET. - Fallback ke token statis di tabel
directus_usersjika verifikasi JWT gagal. - Menyisipkan hasil user terverifikasi ke
request.user.
Di luar scope context ini:
- Otorisasi per role/permission endpoint.
- Refresh token/session management.
- Pembuatan token login.
2. Komponen Utama (kelas/fungsi + peran)
-
AuthModulePeran: module global yang menyediakan dan mengeksporDatacoreTokenService. Path:packages/lib/src/auth/auth.module.ts -
DatacoreJwtGuard.canActivate(context)Peran: guard HTTP untuk parsing bearer token, verifikasi token, dan injectrequest.user. Path:packages/lib/src/auth/datacore-jwt/datacore-jwt.guard.ts -
DatacoreTokenService.verifyToken(token)Peran: verifikasi token dengan strategi 2 langkah (JWT -> fallback DB token statis). Path:packages/lib/src/auth/datacore-token/datacore-token.service.ts -
DecodedTokenPeran: kontrak shape user hasil verifikasi token. Path:packages/lib/src/auth/interfaces/decoded-token.interface.ts
3. Alur System Behavior (happy path, step-by-step)
- Request masuk ke endpoint API yang memakai
@UseGuards(DatacoreJwtGuard). - Guard mengambil
request.headers.authorization. - Jika header tidak diawali
Bearer, guard langsung throwUnauthorizedException('Invalid Authorization header'). - Guard mengambil token (
authHeader.split(' ')[1]) lalu memanggilDatacoreTokenService.verifyToken(token). - Service mencoba verifikasi JWT (
HS256) dengan secret dariprocess.env.SECRET. - Jika JWT valid, service return payload decoded sebagai
DecodedToken. - Jika JWT gagal diverifikasi, service query tabel
directus_usersberdasarkan kolomtoken. - Jika token statis ditemukan, service membentuk object user (
id,role,app_access=true,admin_access=true) lalu return. - Jika token statis tidak ditemukan, service throw
UnauthorizedException('Invalid token'). - Guard menyimpan user ke
(request as any).userdan returntrue.
4. Flowchart (Mermaid)
5. Trigger & Input (API/event/scheduler + payload penting)
Trigger:
- HTTP request ke controller API yang memakai
DatacoreJwtGuard. Contoh path pemakaian guard: apps/api/src/api/core/workflow/workflow.controller.tsapps/api/src/api/core/cache/cache.controller.tsapps/api/src/api/dms/kanban/kanban.controller.ts
5.1 Detail Input (tabel)
| Input | Type | Wajib | Keterangan |
|---|---|---|---|
headers.authorization | string | Ya | Format wajib Bearer <token>. |
token | string | Ya | Diambil dari header authorization. |
process.env.SECRET | string | undefined | Kondisional | Dipakai saat verifikasi JWT; jika JWT gagal maka fallback ke DB token statis. |
6. Output & Side Effects (DB update, publish event, external call)
Output utama:
- Guard return
truebila token valid. - Guard melempar
UnauthorizedExceptionbila token/header tidak valid.
Side effect:
- Menulis
request.useruntuk dipakai layer controller/service berikutnya. - Read query ke tabel
directus_userssaat fallback token statis. - Tidak ada insert/update/delete DB.
6.1 Detail Output (tabel)
| Output | Type | Keterangan |
|---|---|---|
canActivate success | boolean | Selalu true jika lolos autentikasi. |
request.user | DecodedToken | Berisi user hasil JWT atau fallback DB token statis. |
| Error header | UnauthorizedException | Pesan: Invalid Authorization header. |
| Error token | UnauthorizedException | Pesan: Invalid token. |
7. Error Handling
- Header kosong/salah format ->
UnauthorizedException('Invalid Authorization header'). - JWT gagal diverifikasi dan token statis tidak ditemukan ->
UnauthorizedException('Invalid token'). - Error apapun dari
verifyToken(...)ditangkap guard dan dinormalisasi jadiUnauthorizedException('Invalid token').
8. Edge Cases
- Header
Bearertanpa token akan diproses sebagai token kosong dan berujungInvalid token. - Jika JWT invalid karena secret salah/expired, sistem tetap mencoba fallback DB token statis.
- Fallback DB token statis selalu mengembalikan
app_access=truedanadmin_access=true. - Guard menulis
request.usermemakai cast(request as any), belum ada typed request khusus.
9. Dependency & Integrasi
Dependency internal:
@nestjs/common(CanActivate,UnauthorizedException,Module,Global).@nestjs/typeorm(@InjectDataSource('datacore_db')).jsonwebtokenuntuk verifikasi JWT.typeormDataSourceuntuk query fallback token statis.
Integrasi:
apps/api/src/app.module.tsmengimporAuthModule.- Controller API yang memakai
@UseGuards(DatacoreJwtGuard).
10. Data Model yang relevan (ringkas, referensi ke ERD/entitas)
- Tabel
directus_users(dipakai pada fallback token statis):
- kolom yang diakses:
id,role,token. Path query:packages/lib/src/auth/datacore-token/datacore-token.service.ts
- Kontrak data user hasil verifikasi:
DecodedTokendipackages/lib/src/auth/interfaces/decoded-token.interface.ts
11. Referensi Kode (path file yang dipakai)
packages/lib/src/auth/auth.module.tspackages/lib/src/auth/datacore-jwt/datacore-jwt.guard.tspackages/lib/src/auth/datacore-token/datacore-token.service.tspackages/lib/src/auth/interfaces/decoded-token.interface.tspackages/lib/src/auth/datacore-jwt/datacore-jwt.guard.spec.tspackages/lib/src/auth/datacore-token/datacore-token.service.spec.tsapps/api/src/app.module.tsapps/api/src/api/core/workflow/workflow.controller.ts
12. Open Questions
- Apakah fallback DB token statis memang harus selalu memberi
admin_access=trueuntuk semua user bertoken statis? - Apakah perlu typed request khusus (misalnya
RequestWithUser) agar aksesrequest.usertidak memakaiany?