Panduan Integrasi SSO SIMPANG KUDUS
Selamat datang di dokumentasi resmi integrasi Single Sign-On (SSO) Pemerintah Kabupaten Kudus.
Dokumen ini ditujukan untuk pengembang aplikasi (Developer) di lingkungan Pemkab Kudus yang ingin mengintegrasikan sistem login mereka dengan standar keamanan SIMPANG KUDUS.
Daftar Isi
- Pengantar & Konsep Dasar
- Persiapan Awal
- Spesifikasi API (Reference)
- Panduan Implementasi (Step-by-Step)
- Keamanan & Best Practices
- Troubleshooting & FAQ
- Bantuan & Kontak
1. Pengantar & Konsep Dasar
Kami menggunakan protokol OAuth 2.0 standar industri. Jika Anda pernah menggunakan "Login with Google" atau "Login with Facebook", konsepnya sama persis.
Istilah Penting
| Istilah | Penjelasan Sederhana |
|---|---|
| Client ID | "Username" aplikasi Anda. Publik, boleh diketahui orang lain. |
| Client Secret | "Password" aplikasi Anda. RAHASIA. Hanya boleh diketahui oleh server Anda. |
| Redirect URI | Alamat URL di aplikasi Anda yang akan menerima user setelah login sukses. |
| Authorization Code | Tiket sementara (berlaku pendek) yang ditukar menjadi Access Token. |
| Access Token | Kunci digital untuk mengakses data user. Berlaku 1 jam. |
| Refresh Token | Kunci cadangan untuk mendapatkan Access Token baru tanpa login ulang. |
2. Persiapan Awal
Sebelum menulis kode, pastikan Anda telah menghubungi Tim Teknis IT Bagian PBJ untuk mendaftarkan aplikasi Anda.
Data yang Anda butuhkan dari kami:
Client ID(Format: UUID, contoh: 9xyz...)Client Secret(String acak panjang)
Data yang harus Anda setor ke kami:
Redirect URI(Contoh:https://aplikasi-anda.kuduskab.go.id/callback)
⚠️ Penting: Redirect URI di kode Anda harus sama persis karakter-per-karakter dengan yang didaftarkan.
3. Spesifikasi API (Reference)
Berikut detail teknis endpoint yang tersedia di Server SSO.
A. Authorization Endpoint
Endpoint untuk memulai alur login (User Interface).
| Detail | Nilai |
|---|---|
| Method | GET |
| URL | https://simpangkudus.kuduskab.go.id/sso/oauth/authorize |
Parameter Query:
| Parameter | Wajib | Contoh Value | Deskripsi |
|---|---|---|---|
client_id |
Ya | 9a2b3c... |
ID Aplikasi Anda. |
redirect_uri |
Ya | https://app.com/cb |
URL callback Anda. |
response_type |
Ya | code |
Selalu gunakan code. |
state |
Ya | xyz123 |
String acak untuk mencegah CSRF attack. |
B. Token Endpoint
Endpoint untuk menukar Code menjadi Token (Back-channel).
| Detail | Nilai |
|---|---|
| Method | POST |
| URL | https://simpangkudus.kuduskab.go.id/sso/oauth/token |
| Content-Type | application/x-www-form-urlencoded |
Request Body:
| Parameter | Wajib | Value | Deskripsi |
|---|---|---|---|
grant_type |
Ya | authorization_code |
Jenis permintaan. |
client_id |
Ya | 9a2b3c... |
ID Aplikasi Anda. |
client_secret |
Ya | s3cr3t... |
Password Aplikasi Anda. |
redirect_uri |
Ya | https://app.com/cb |
Harus sama persis dengan step A. |
code |
Ya | def502... |
Code yang didapat dari callback. |
Success Response (JSON):
{
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0a...",
"refresh_token": "def50200d72023cb3f..."
}
C. User Info Endpoint
Endpoint untuk melihat profil user.
| Detail | Nilai |
|---|---|
| Method | GET |
| URL | https://simpangkudus.kuduskab.go.id/sso/api/user |
| Header | Authorization: Bearer <access_token> |
Success Response (JSON):
{
"id": 15,
"name": "Budi Santoso, S.Kom",
"email": "budi@kuduskab.go.id",
"nip": "198501152010011005",
"phone": "081234567890",
"user_type": "ASN",
"status": "ACTIVE",
"roles": [
"ADMIN_OPD",
"VERIFIKATOR"
],
"active_satker": {
"kd_satker": "123456",
"nama_satker": "DINAS KOMUNIKASI DAN INFORMATIKA"
}
}
4. Panduan Implementasi (Step-by-Step)
Berikut adalah contoh implementasi menggunakan PHP Native. Logika ini bisa diaplikasikan ke framework apapun (Laravel, CI, Node.js, dll).
Tahap 1: Buat Link Login
Di halaman login aplikasi Anda, buat tombol yang mengarah ke URL Authorize.
<?php
// login.php
$query = http_build_query([
'client_id' => 'CLIENT_ID_DARI_KAMI',
'redirect_uri' => 'https://aplikasi-anda.com/callback',
'response_type' => 'code',
'scope' => '',
'state' => bin2hex(random_bytes(16)) // Security Token
]);
$sso_link = "https://simpangkudus.kuduskab.go.id/sso/oauth/authorize?" . $query;
?>
<a href="<?= $sso_link ?>">Login dengan SIMPANG KUDUS</a>
Tahap 2: Tangani Callback
Buat file callback.php untuk menerima user yang kembali dari SSO.
<?php
// callback.php
// 1. Validasi Code
if (!isset($_GET['code'])) {
die("Error: User menolak akses atau terjadi kesalahan.");
}
// 2. Siapkan Data Pertukaran
$params = [
'grant_type' => 'authorization_code',
'client_id' => 'CLIENT_ID_DARI_KAMI',
'client_secret' => 'CLIENT_SECRET_RAHASIA',
'redirect_uri' => 'https://aplikasi-anda.com/callback',
'code' => $_GET['code'],
];
// 3. Kirim Request ke Server SSO
$ch = curl_init("https://simpangkudus.kuduskab.go.id/sso/oauth/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_raw = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$token_data = json_decode($response_raw, true);
// 4. Cek Error
if ($http_code !== 200 || !isset($token_data['access_token'])) {
die("Gagal mendapatkan token: " . ($token_data['message'] ?? 'Unknown error'));
}
// 5. Simpan Token (Opsional, jika butuh akses API jangka panjang)
$access_token = $token_data['access_token'];
// 6. Ambil Data User
$ch_user = curl_init("https://simpangkudus.kuduskab.go.id/sso/api/user");
curl_setopt($ch_user, CURLOPT_HTTPHEADER, [
"Authorization: Bearer " . $access_token,
"Accept: application/json"
]);
curl_setopt($ch_user, CURLOPT_RETURNTRANSFER, true);
$user_json = curl_exec($ch_user);
curl_close($ch_user);
$user_data = json_decode($user_json, true);
// 7. Login ke Sesi Aplikasi Lokal
session_start();
$_SESSION['user_sso'] = $user_data;
$_SESSION['fullname'] = $user_data['name'];
header("Location: /dashboard.php");
exit;
5. Keamanan & Best Practices
- Validasi State: Selalu gunakan parameter
state(string acak) saat redirect login, dan cek kembali saat callback untuk mencegah serangan CSRF. - HTTPS Wajib: Jangan pernah mengirim
client_secretatauaccess_tokenmelalui koneksi HTTP biasa. - Simpan Secret di Server: Jangan pernah menaruh
client_secretdi kode Javascript Frontend (React/Vue) yang bisa dibaca user. OAuth Code Flow harus dilakukan di Backend. - Error Handling: Selalu cek HTTP Status Code. Jangan asumsikan request selalu 200 OK.
6. Troubleshooting & FAQ
| Masalah | Kemungkinan Penyebab | Solusi |
|---|---|---|
| Redirect URI Mismatch | URL di kode beda 1 huruf dengan di DB server. | Cek http vs https, atau trailing slash /. |
| Invalid Client | ID atau Secret salah. | Pastikan copy-paste tanpa spasi tambahan. |
| Token Expired | Access Token sudah > 1 jam. | Gunakan Refresh Token atau minta user login lagi. |
| CORS Error | Request Token dari JS Frontend. | Pindahkan proses tukar token ke Backend PHP/Node. |
7. Bantuan & Kontak
Jika mengalami kendala teknis yang tidak terpecahkan, tim kami siap membantu.
Tim Teknis IT Bagian PBJ Kudus
- Email: pbj.kabkudus@gmail.com
- Jam Kerja: Senin - Jumat, 07:30 - 15:30 WIB
© 2026 Pemerintah Kabupaten Kudus. All rights reserved.