# Dokumentasi API Authentication

## Informasi Umum

Endpoint: /api/authentication Method: POST Content-Type: application/json

## Request Body

### Contoh Request

{
  "nrk": "22002744",
  "password": "password123",
  "appid": "APP001",
  "ip": "192.168.1.100"
}

## Response Codes

### Daftar Response Code

## Response Examples

### 1. Success Response (rcode: 00)

Scenario: Login berhasil dengan kredensial yang valid

{
  "rcode": "00",
  "rdesc": "Sukses",
  "rdata": {
    "userid": "22002744",
    "nama": "KELVIN FRASETIA",
    "ketunit": "DIVISI TEKHNOLOGI INFORMASI",
    "unit": "813",
    "unit_induk": "AREA_01",
    "userid_olibs": "OLB123456",
    "reset": "0",
    "role": "ADMIN",
    "lastsession": "2026-01-14 10:30:45"
  }
}

Response Data Fields:

### 2. Error Response - Parameter Tidak Lengkap (rcode: 99)

Scenario: Request tidak menyertakan parameter yang wajib (nrk, password, appid, atau ip)

{
  "rcode": "99",
  "rdesc": "Parameter tidak lengkap"
}

### 3. Error Response - Password Salah (rcode: 99)

Scenario: NRK atau password yang diinputkan salah (belum mencapai limit)

{
  "rcode": "99",
  "rdesc": "NRK atau Password salah"
}

### 4. Warning Response - Password Salah Mendekati Limit (rcode: 93)

Scenario: User salah input password dan sudah mencapai limit - 1 kali

{
  "rcode": "93",
  "rdesc": "Sudah 4 kali salah password, sisa kesalahan 1 kali dan user anda akan di blokir!"
}

### 5. Error Response - User Terblokir (rcode: 94)

Scenario: User sudah melebihi limit kesalahan password atau sudah terblokir sebelumnya

{
  "rcode": "94",
  "rdesc": "User anda di blokir"
}

Catatan: Untuk membuka blokir, hubungi administrator atau reset melalui menu reset password

### 6. Error Response - User Belum Terdaftar (rcode: 95)

Scenario: NRK tidak ditemukan di database aplikasi

{
  "rcode": "95",
  "rdesc": "User belum terdaftar di aplikasi"
}

### 7. Error Response - User Tidak Aktif (rcode: 98)

Scenario: User ada di database tetapi status aktif = 0

{
  "rcode": "98",
  "rdesc": "User ini tidak aktif"
}

### 8. Error Response - User Belum Reset Password (rcode: 91)

Scenario: User baru atau diminta untuk reset password (field reset = 1)

{
  "rcode": "91",
  "rdesc": "User belum aktif, harap ganti password terlebih dahulu pada aplikasi AUTH agar user anda aktif"
}

Action: User harus melakukan reset password terlebih dahulu di aplikasi AUTH

### 9. Error Response - Branch Tidak Sesuai (rcode: 02)

Scenario: Unit kerja di HRIS (OFFCODE) tidak sesuai dengan unit kerja yang terdaftar di aplikasi (branchid)

{
  "rcode": "02",
  "rdesc": "Unit Kerja (aplikasi) Tidak Sesuai dengan HRIS Minova, Silahkan Hubungi SDI Kantor Cabang/Pusat !"
}

Action: User harus menghubungi SDI untuk sinkronisasi data unit kerja

### 10. Error Response - Tidak Ada Akses (rcode: 92)

Scenario: User tidak memiliki akses ke aplikasi yang diminta (tidak ada di tbl_acl)

{
  "rcode": "92",
  "rdesc": "User tidak memiliki akses ke aplikasi ini"
}

Action: User harus meminta akses dari administrator aplikasi

### 11. Error Response - Koneksi Gagal (rcode: xx)

Scenario: Tidak dapat terhubung ke service HRIS Minova

{
  "rcode": "xx",
  "rdesc": "Tidak dapat terhubung ke mware minova Connection timeout"
}

## Flow Diagram

START
  ↓
Validasi Input (nrk, password, appid, ip)
  ↓ [VALID]
Get Employee Data dari HRIS
  ↓ [SUCCESS]
Cek User di Database
  ↓ [FOUND]
Cek Status Aktif User
  ↓ [ACTIVE]
Cek Limit Kesalahan Password
  ↓ [NOT BLOCKED]
Validasi Password
  ↓ [CORRECT]
Cek Akses User ke Aplikasi
  ↓ [HAS ACCESS]
Validasi Unit Kerja
  ↓ [MATCH]
Cek Status Reset Password
  ↓ [NORMAL]
Update Login Info & Return Success
  ↓
END

## Security Features

Password Hashing: Password di-hash menggunakan fungsi generated_password()

Login Attempt Limiting: Sistem membatasi jumlah kesalahan login (diambil dari tbl_system)

Auto Block: User otomatis terblokir setelah melebihi limit kesalahan

IP Address Logging: Setiap login attempt dicatat dengan IP address

Activity Logging: Semua request dan response dicatat di tbl_log

Password Masking: Password di log disamarkan dengan “*****”

## Database Tables

### tbl_user

Menyimpan data user aplikasi

### tbl_acl (Access Control List)

Menyimpan mapping user, aplikasi, dan role

### tbl_system

Menyimpan konfigurasi sistem (URL HRIS, limit password, dll)

### tbl_log

Menyimpan log aktivitas authentication

## Integration dengan HRIS

API ini terintegrasi dengan service HRIS Minova untuk mendapatkan data karyawan:

Endpoint: Diambil dari tbl_system (category=‘url’, name=‘info_karyawan’)

Method: POST

Parameters: reqid, nrk

Response Fields:

EMPID: Employee ID

NRK: Nomor Registrasi Karyawan

EMPNAME: Nama Karyawan

OFFCODE: Kode Unit Kerja

OFFNAME: Nama Unit Kerja

OFFAREA: Kode Area/Unit Induk

POSITION: Posisi/Jabatan

## Error Handling

Semua error ditangani dengan graceful degradation:

Connection Error: Return rcode “xx” dengan pesan error

Validation Error: Return rcode “99” dengan pesan spesifik

Business Logic Error: Return rcode sesuai kondisi (02, 91-95, 98)

All Errors are Logged: Setiap request/response dicatat untuk audit trail

## Best Practices

Selalu validasi input sebelum memanggil API

Handle semua response code di client application

Tampilkan pesan error yang user-friendly

Jangan expose sensitive information di error message

Implement retry logic untuk rcode “xx” (connection error)

Cache user data setelah login success untuk mengurangi API calls

Logout user ketika mendapat rcode 91, 94, 98 (status abnormal)

## Changelog

### Version 2.0 - 2026-01-14

Refactor authentication function

Menghilangkan nested if-else (if-else hell)

Implementasi early return pattern

Pisahkan logic ke private methods:

validateInput(): Validasi parameter input

getEmployeeDataFromHR(): Ambil data dari HRIS

processAuthentication(): Process alur authentication

handleWrongPassword(): Handle password salah

handleSuccessfulLogin(): Handle login sukses

logAuthentication(): Logging request/response

Improve code readability dan maintainability

### Version 1.0

Initial release dengan nested if-else structure

## Contact & Support

Untuk pertanyaan atau issue terkait API ini, silahkan hubungi: - Team: Divisi Teknologi Informasi - Email: support@example.com

Last Updated: 2026-01-14 Document Version: 2.0 API Version: 2.0
