API Login SSO ISDM
Panduan integrasi login untuk aplikasi internal. Kirim id dan paswd sebagai form field, lalu terima profil pengguna beserta informasi absensi hari ini dalam format JSON.
Ringkasan
Endpoint menerima kredensial akun dan mengembalikan profil pengguna, role, unit kerja, data absensi hari ini, profil SISDM, serta Bearer token untuk request berikutnya.
http://myauth.kuroichi.my.id/apisisdm/api/apps/sign
- Base URL
- http://myauth.kuroichi.my.id
- Format
- multipart/form-data
- Autentikasi
- Form login + Bearer token
Autentikasi
Login tidak memakai token. Kirim id dan paswd pada body permintaan. Setelah berhasil, gunakan access_token dari objek bearer untuk request selanjutnya.
Token dikirim melalui header Authorization: Bearer <access_token>. Masa aktifnya 30 hari sejak terakhir dipakai (sliding) dan dapat dicabut kapan saja lewat logout.
Untuk mencegah brute force, maksimal 5 percobaan gagal per kombinasi IP + User ID dalam 15 menit. Percobaan berikutnya dibalas HTTP 429.
Akun demo
| User ID | Password |
|---|---|
| taufan | password |
| dummy001 … dummy100 | password |
Permintaan
Header
| Header | Nilai | Keterangan |
|---|---|---|
| Content-Type | multipart/form-data | Biarkan browser, curl, atau HTTP client menambahkan boundary secara otomatis. |
Body
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
| id | string | Ya | User ID akun |
| paswd | string | Ya | Password akun |
Contoh body
id dan paswd.
cURL
curl -s -X POST http://myauth.kuroichi.my.id/apisisdm/api/apps/sign \ -F 'id=taufan' \ -F 'paswd=password'
PHP 8.5
$ch = curl_init('http://myauth.kuroichi.my.id/apisisdm/api/apps/sign');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => [
'id' => 'taufan',
'paswd' => 'password',
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($response['status'] ?? null) === 'success') {
$user = $response['login_result']['data'][0];
echo $user['user_name'];
}JavaScript (fetch)
const form = new FormData();
form.append('id', 'taufan');
form.append('paswd', 'password');
const response = await fetch('http://myauth.kuroichi.my.id/apisisdm/api/apps/sign', {
method: 'POST',
body: form,
});
const data = await response.json();
if (!response.ok || data.status !== 'success') {
throw new Error(data.login_result?.message ?? 'Login gagal');
}
const user = data.login_result.data[0];
console.log(user.user_name, user.dept_name);Respons sukses
HTTP 200 dengan status: "success" dan login_result.code: "00".
login_result.data[]
| Field | Tipe | Keterangan |
|---|---|---|
| dept_code | string | Kode unit kerja |
| position_category | string | Kategori jabatan |
| strcompanyno | string | Nomor perusahaan |
| device_id | string | ID perangkat, "-" bila tidak ada |
| user_name | string | Nama lengkap pengguna |
| level_id | string | ID level pengguna |
| position_name | string | Nama jabatan |
| dept_name | string | Nama unit kerja |
| device_type | string | Tipe perangkat, "-" bila tidak ada |
| position_name_2 | string | Nama jabatan lengkap |
| dept_abbr | string | Singkatan unit kerja |
| user_no | string | NIP pengguna |
| datechangepass | string|null | Waktu password terakhir diubah |
| user_id | string | User ID akun |
| role_id | integer | ID role, 1 = admin |
| islevel | string | Flag level pengguna |
| position_alias | string | Alias jabatan |
| personno | string | Nomor person |
| position_id | integer | ID jabatan |
absensi_sikap.data
| Field | Tipe | Keterangan |
|---|---|---|
| nip | string | NIP pengguna |
| nama | string | Nama lengkap pengguna |
| jam_masuk | string|null | Jam absen masuk (HH:MM:SS), null bila belum ada |
| jam_keluar | string|null | Jam absen keluar (HH:MM:SS), null bila belum ada |
data_pegawai_sisdm
| Field | Tipe | Keterangan |
|---|---|---|
| GELAR_DEPAN | string | Gelar depan |
| NAMA | string | Nama lengkap pegawai |
| GELAR_BELAKANG | string | Gelar belakang |
| NUP_BP | string | NIP dengan pemisah spasi |
| NUP_BP_NOSPACE | string | NIP tanpa spasi |
| NUP_GAJI | string | Nomor gaji (6 digit terakhir NIP) |
| GOL_BP | integer | Golongan badan pengurus |
| GOL_PNS | string|null | Golongan PNS |
| UNIT_KERJA | string | Nama unit kerja |
| UNIT_KERJA_SUB | string | Nama sub unit kerja |
| KODE_ORG | string | Kode organisasi |
| JABATAN | string | Jabatan |
| JABATAN_TINGKAT | string|null | Tingkat jabatan |
| NAMA_JABATAN | string | Nama jabatan lengkap |
| KELAS_JABATAN | string | Kelas jabatan |
| PENDIDIKAN | string | Pendidikan terakhir |
| JURUSAN | string | Jurusan pendidikan |
| STATUS_PEGAWAI | string | Status pegawai |
| GOL_BP_GAJI | string | Golongan gaji |
| TEMPAT_LAHIR | string | Tempat lahir |
| TGL_LAHIR | string|null | Tanggal lahir (DD-MM-YYYY) |
bearer
| Field | Tipe | Keterangan |
|---|---|---|
| message | string | Pesan pembuka dari server |
| access_token | string | Token akses berformat <id>|<secret> |
| token_type | string | Tipe token, selalu Bearer |
Token hanya ditampilkan sekali saat login. Server menyimpan hash secret, bukan token aslinya.
Contoh respons lengkap
{
"status": "success",
"login_result": {
"code": "00",
"data": [
{
"dept_code": "01756",
"position_category": "E9",
"strcompanyno": "00001",
"device_id": "-",
"user_name": "TAUFAN MAULANA HARIES",
"level_id": "NG",
"position_name": "Staff",
"dept_name": "Sub Bagian Sistem Informasi Sumber Daya Manusia",
"device_type": "-",
"position_name_2": "Staf Sub Bagian Sistem Informasi Sumber Daya Manusia",
"dept_abbr": "A1.323",
"user_no": "1990012026013357",
"datechangepass": "2026-08-13 07:53:40",
"user_id": "taufan",
"role_id": 10,
"islevel": "0",
"position_alias": "Staf",
"personno": "04574",
"position_id": 10
}
]
},
"absensi_sikap": {
"message": "Data berhasil diambil",
"data": {
"nip": "1990012026013357",
"nama": "TAUFAN MAULANA HARIES",
"jam_masuk": "07:14:01",
"jam_keluar": null
}
},
"data_pegawai_sisdm": {
"GELAR_DEPAN": "",
"NAMA": "TAUFAN MAULANA HARIES",
"GELAR_BELAKANG": ", S.Kom",
"NUP_BP": "199001 202601 3357",
"NUP_BP_NOSPACE": "1990012026013357",
"NUP_GAJI": "013357",
"GOL_BP": 9,
"GOL_PNS": null,
"UNIT_KERJA": "BIRO SUMBER DAYA MANUSIA",
"UNIT_KERJA_SUB": "SUBBAGIAN SISTEM INFORMASI SUMBER DAYA MANUSIA",
"KODE_ORG": "0103.02.03",
"JABATAN": "STAF",
"JABATAN_TINGKAT": null,
"NAMA_JABATAN": "ANALIS SISTEM INFORMASI",
"KELAS_JABATAN": "7-c",
"PENDIDIKAN": "S1/D.IV",
"JURUSAN": "S-1 SISTEM INFORMASI",
"STATUS_PEGAWAI": "NON",
"GOL_BP_GAJI": "09",
"TEMPAT_LAHIR": "TANJUNG PINANG",
"TGL_LAHIR": "12-01-1990"
},
"bearer": {
"message": "Hi sikap, welcome to home",
"access_token": "1509133|C8PytmNhnGkO79TlsUZh0zl6Ipn7KUdDTRlAY87w",
"token_type": "Bearer"
}
}
Bearer token
Objek bearer membuat sesi login berkelanjutan: simpan access_token, lalu kirim pada header setiap request. Masa aktif diperpanjang otomatis 30 hari setiap kali token dipakai.
Header
Authorization: Bearer 1|C8PytmNhnGkO79TlsUZh0zl6Ipn7KUdDTRlAY87w
Endpoint
| Metode | Path | Fungsi |
|---|---|---|
| GET | /apisisdm/api/apps/me | Validasi token dan ambil data user, absensi, serta profil SISDM |
| POST | /apisisdm/api/apps/logout | Cabut token yang sedang dipakai |
Ambil data dengan token
curl -s http://myauth.kuroichi.my.id/apisisdm/api/apps/me \ -H 'Authorization: Bearer <access_token>'
Respons /me sama dengan respons login tanpa objek bearer.
Logout / cabut token
curl -s -X POST http://myauth.kuroichi.my.id/apisisdm/api/apps/logout \ -H 'Authorization: Bearer <access_token>'
{
"status": "success",
"message": "Access token berhasil dicabut."
}Error
Respons gagal tetap berformat JSON dengan status: "error" dan pesan pada login_result.message.
| HTTP | Code | Penyebab |
|---|---|---|
| 401 | 01 | User ID atau password salah |
| 422 | 02 | User ID atau password kosong |
| 429 | 03 | Terlalu banyak percobaan login |
| 405 | 04 | Metode tidak sesuai |
| 401 | 05 | Bearer token tidak valid, kedaluwarsa, atau sudah dicabut |
| 500 | — | Kesalahan server |
Contoh respons 401
{
"status": "error",
"login_result": {
"code": "01",
"message": "User ID atau password salah."
}
}Catatan integrasi
- CORS belum aktif. Panggilan langsung dari browser di domain lain akan ditolak browser. Panggil API dari server, atau aktifkan CORS di sisi server terlebih dahulu.
- Jangan simpan password. Simpan hanya data pengguna yang diperlukan dan gunakan HTTPS untuk setiap permintaan.
- Access token bersifat rahasia. Simpan di tempat aman, jangan tampilkan di log, dan cabut lewat logout jika token bocor atau perangkat tidak dipakai lagi.
- Data absensi bersifat opsional. Bila belum ada absensi hari ini,
jam_masukdanjam_keluarbernilainull. - Akun demo hanya untuk uji coba. Jangan memakai akun demo di lingkungan produksi.