IS SSO ISDM Dokumentasi API
Dokumentasi publik

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.

POST multipart/form-data Access token Maks. 5 percobaan / 15 menit

Ringkasan

Endpoint menerima kredensial akun dan mengembalikan profil pengguna, role, unit kerja, data absensi hari ini, profil SISDM, serta Bearer token untuk request berikutnya.

POST 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.

Password dikirim sebagai teks biasa di dalam body. Selalu gunakan HTTPS saat memanggil API dari jaringan publik.

Untuk mencegah brute force, maksimal 5 percobaan gagal per kombinasi IP + User ID dalam 15 menit. Percobaan berikutnya dibalas HTTP 429.

Akun demo

User IDPassword
taufanpassword
dummy001 … dummy100password

Permintaan

Header

HeaderNilaiKeterangan
Content-Type multipart/form-data Biarkan browser, curl, atau HTTP client menambahkan boundary secara otomatis.

Body

FieldTipeWajibKeterangan
id string Ya User ID akun
paswd string Ya Password akun

Contoh body

Body dikirim sebagai form field, bukan JSON. Gunakan field 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".

{ status, login_result: { code, data[] }, absensi_sikap: { message, data }, data_pegawai_sisdm: { ... }, bearer: { message, access_token, token_type } }

login_result.data[]

FieldTipeKeterangan
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

FieldTipeKeterangan
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

FieldTipeKeterangan
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

FieldTipeKeterangan
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

MetodePathFungsi
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.

HTTPCodePenyebab
40101User ID atau password salah
42202User ID atau password kosong
42903Terlalu banyak percobaan login
40504Metode tidak sesuai
40105Bearer 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_masuk dan jam_keluar bernilai null.
  • Akun demo hanya untuk uji coba. Jangan memakai akun demo di lingkungan produksi.