Deskripsi Masalah
Endpoint /api/token dapat dipanggil tanpa autentikasi apapun. Siapapun bisa mendapatkan token API yang valid dan mengakses semua endpoint API yang diproteksi.
Berbeda dengan Issue #965:
Kondisi Saat Ini
// app/Http/Controllers/Api/Auth/AuthController.php (Baris 95-100)
public function token()
{
$user = User::whereUsername('synchronize')->first();
$token = $user->createToken('auth_token', ['synchronize-opendk-create'])->plainTextToken;
return response()->json(['message' => 'Token Synchronize', 'access_token' => $token, 'token_type' => 'Bearer']);
}
Masalah:
- ❌ Tidak ada pengecekan apakah user sudah login
- ❌ Tidak ada pengecekan role/permission
- ❌ Tidak ada validasi apapun
- ❌ Siapa saja dengan akses internet bisa dapat token
Kondisi yang Diharapkan
- ✅ Hanya user dengan role
administrator yang bisa generate token
- ✅ Semua request ke
/api/token harus melewati middleware auth:sanctum
- ✅ Setiap pembuatan token dicatat di activity_log
Cara Reproduksi (Bug)
# 1. Siapapun bisa call endpoint ini TANPA login
curl https://devopenkab.opendesa.id/api/token
# 2. Response akan berisi token valid
{
"message": "Token Synchronize",
"access_token": "1|abc123xyz...",
"token_type": "Bearer"
}
# 3. Token bisa dipakai untuk akses endpoint protected
curl -H "Authorization: Bearer 1|abc123xyz..." \
https://devopenkab.opendesa.id/api/v1/identitas
Dampak
| Dampak |
Tingkat |
| Akses data pemerintah tanpa izin |
🔴 KRITIS |
| Modifikasi data via API |
🔴 KRITIS |
| Sinkronisasi OpenDK oleh pihak tidak berwenang |
🟠 TINGGI |
Solusi (BEST PRACTICE)
Karena endpoint ini untuk service account (bukan user manusia), gunakan API credentials dari environment variable.
Langkah 1: Tambahkan Middleware Auth
// routes/apiv1.php (Baris 42)
// UBAH DARI:
Route::get('/token', [AuthController::class, 'token']);
// MENJADI:
Route::middleware(['auth:sanctum', 'role:administrator'])->get('/token', [AuthController::class, 'token']);
Langkah 2: Update Controller
// app/Http/Controllers/Api/Auth/AuthController.php
public function token(Request $request)
{
// Middleware sudah handle auth, tinggal generate token
$user = User::whereUsername('synchronize')->first();
if (!$user) {
return response()->json([
'message' => 'Synchronize user not found'
], 404);
}
// Revoke token lama (security best practice)
$user->tokens()->delete();
$token = $user->createToken('auth_token', ['synchronize-opendk-create'])->plainTextToken;
// Log untuk audit
activity()
->performedOn($user)
->causedBy(auth()->user())
->withProperties(['ip' => $request->ip()])
->log('token.generated');
return response()->json([
'message' => 'Token Synchronize',
'access_token' => $token,
'token_type' => 'Bearer'
]);
}
Testing Checklist
Setelah fix, verifikasi:
Referensi
Related Issues
🚨 PRIORITAS: SEGERA DIPERBAIKI
Vulnerability ini memungkinkan siapapun untuk:
- Mendapatkan token API valid tanpa login
- Mengakses semua endpoint API yang diproteksi
- Mengambil data pemerintah daerah
- Melakukan sinkronisasi OpenDK tanpa izin
Deskripsi Masalah
Endpoint
/api/tokendapat dipanggil tanpa autentikasi apapun. Siapapun bisa mendapatkan token API yang valid dan mengakses semua endpoint API yang diproteksi.Berbeda dengan Issue #965:
Kondisi Saat Ini
Masalah:
Kondisi yang Diharapkan
administratoryang bisa generate token/api/tokenharus melewati middlewareauth:sanctumCara Reproduksi (Bug)
Dampak
Solusi (BEST PRACTICE)
Karena endpoint ini untuk service account (bukan user manusia), gunakan API credentials dari environment variable.
Langkah 1: Tambahkan Middleware Auth
Langkah 2: Update Controller
Testing Checklist
Setelah fix, verifikasi:
/api/opendk/dataReferensi
Related Issues
🚨 PRIORITAS: SEGERA DIPERBAIKI
Vulnerability ini memungkinkan siapapun untuk: