Skip to content

[CRITICAL] Endpoint /api/token Dapat Diakses Tanpa Autentikasi #974

@Revanza1106

Description

@Revanza1106

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:

  • Request tanpa token → Return 401 Unauthorized
  • Request dengan token user biasa → Return 403 Forbidden
  • Request dengan token admin → Return 200 OK + token baru
  • Token yang dihasilkan bisa akses endpoint /api/opendk/data
  • Activity log mencatat pembuatan token
  • Service account masih bisa sinkronisasi normal (tidak kena rate limit)

Referensi

Related Issues


🚨 PRIORITAS: SEGERA DIPERBAIKI

Vulnerability ini memungkinkan siapapun untuk:

  1. Mendapatkan token API valid tanpa login
  2. Mengakses semua endpoint API yang diproteksi
  3. Mengambil data pemerintah daerah
  4. Melakukan sinkronisasi OpenDK tanpa izin

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions