Lewati ke konten utama

Autentikasi & Otorisasi

Dokumentasi lengkap sistem autentikasi dan otorisasi di LMS Codeverta.


Ikhtisar Sistem Autentikasi​

LMS Codeverta menggunakan JWT (JSON Web Token) berbasis autentikasi dengan dukungan Access Token dan Refresh Token. Sistem ini juga mendukung session-based authentication sebagai fallback, serta WebAuthn (Passkey) untuk autentikasi tanpa password.

Alur Autentikasi Dasar​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client β”‚ β”‚ API β”‚ β”‚ Database β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚
β”‚ POST /login β”‚ β”‚
β”‚ {email, pass} β”‚ β”‚
│──────────────────▢│ β”‚
β”‚ β”‚ Verify Creds β”‚
β”‚ │──────────────────▢│
β”‚ │◀──────────────────│
β”‚ β”‚ β”‚
β”‚ {access_token β”‚ β”‚
β”‚ refresh_token} β”‚ β”‚
│◀──────────────────│ β”‚
β”‚ β”‚ β”‚
β”‚ GET /courses β”‚ β”‚
β”‚ (Bearer token) β”‚ β”‚
│──────────────────▢│ β”‚
β”‚ β”‚ Validate JWT β”‚
β”‚ β”‚ (middleware) β”‚
β”‚ β”‚ β”‚
β”‚ {courses data} β”‚ β”‚
│◀──────────────────│ β”‚

Metode Autentikasi​

1. Login dengan Email & Password​

Metode autentikasi standar menggunakan email dan password.

Endpoint: POST /api/auth/login

Request:

{
"email": "user@example.com",
"password": "password123"
}

Response (Sukses):

{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": "uuid-user",
"email": "user@example.com",
"display_name": "User Display Name",
"role": 1,
"status": 1
},
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}
}

2. Refresh Token​

Access Token memiliki masa berlaku yang pendek (5 menit). Gunakan Refresh Token untuk mendapatkan Access Token baru tanpa login ulang.

Endpoint: POST /api/auth/refresh

Request:

{
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}

Response:

{
"success": true,
"message": "Token refreshed successfully",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs... (new)",
"refresh_token": "eyJhbGciOiJIUzI1NiIs... (new)"
}
}

3. WebAuthn (Passkey)​

LMS Codeverta mendukung WebAuthn untuk autentikasi tanpa password menggunakan passkey (biometric, PIN, atau security key).

Cara Kerja:

  1. User melakukan registrasi perangkat (public key disimpan di server)
  2. Saat login, user cukup menggunakan sidik jari, face ID, atau PIN
  3. Tidak perlu memasukkan password

Endpoint WebAuthn:

  • POST /api/auth/webauthn/register/begin β€” Memulai registrasi passkey
  • POST /api/auth/webauthn/register/finish β€” Menyelesaikan registrasi
  • POST /api/auth/webauthn/login/begin β€” Memulai login passkey
  • POST /api/auth/webauthn/login/finish β€” Menyelesaikan login

4. Session-Based Authentication (Fallback)​

Selain JWT, sistem juga mendukung session-based auth menggunakan gin-contrib/sessions:

  • Session disimpan di Redis (jika Redis enabled) atau Cookie store (fallback)

Token Lifetime & Security​

Access Token​

PropertiNilai
Durasi5 menit
PenyimpananMemory / localStorage (client)
PenggunaanSetiap request ke API (Authorization header)
RisikoInformasi bisa dibaca payload (base64 encoded, bukan encrypted)

Refresh Token​

PropertiNilai
Durasi7 hari
PenyimpananhttpOnly cookie / secure storage
PenggunaanHanya untuk mendapatkan access token baru
KeamananHarus disimpan dengan aman (jangan di localStorage)

Best Practice Keamanan Token​

Rekomendasi
  1. Simpan access token di memory β€” Jangan di localStorage (rawan XSS)
  2. Simpan refresh token di httpOnly cookie β€” Tidak bisa diakses JavaScript
  3. Gunakan HTTPS β€” Enkripsi semua komunikasi
  4. Rotasi refresh token β€” Setiap kali refresh, token lama tidak valid
  5. Set expiry yang wajar β€” Access token pendek, refresh token lebih panjang
  6. Jangan sertakan data sensitif di payload JWT β€” Payload hanya base64 encoded

Otorisasi: Role-Based Access Control (RBAC)​

Level Role​

LMS Codeverta menggunakan sistem RBAC dengan level numerik:

RoleLevelKodeDeskripsi
Super Admin100role_admin_rootAkses penuh ke semua fitur sistem
Admin99role_adminAkses manajemen platform sehari-hari
Mentor30role_mentorMengelola siswa, menilai tugas
Orang Tua10role_parentMemantau progres belajar anak
Siswa1role_common_user / role_studentMengakses kursus dan belajar

Pengecekan Role di Backend​

Backend memeriksa role user di setiap endpoint yang memerlukan otorisasi:

// Contoh pengecekan role di controller
userID, role, ok := currentLMSUser(c)
if role < 99 {
sendError(c, http.StatusForbidden, "Insufficient permission", nil)
return
}

Route Protection​

Setiap route group dilindungi oleh middleware yang sesuai:

Route GroupMinimum RoleMiddleware
/api/auth/*Public-
/api/me/*1 (Siswa)Auth middleware
/api/students/*1 (Siswa)Auth middleware
/api/admin/*99 (Admin)Auth + Admin middleware
/api/lms/admin/*99 (Admin)Auth + Admin middleware
/api/lms/mentor/*30 (Mentor)Auth + Mentor middleware
/api/lms/students/*1 (Siswa)Auth middleware
/api/parent/*10 (Orang Tua)Auth + Parent middleware

Hierarki Akses​

Super Admin (100) ─── Bisa melakukan apa saja
β”‚
Admin (99) ─── Bisa mengelola semua kecuali Super Admin
β”‚
Mentor (30) ─── Bisa mengelola siswa dan tugas
β”‚
Orang Tua (10) ─── Bisa memantau anak sendiri
β”‚
Siswa (1) ─── Bisa mengakses kursus dan belajar

Aturan Hierarki:

  • User hanya bisa memodifikasi user dengan role lebih rendah
  • Super Admin (100) tidak bisa dimodifikasi oleh siapapun
  • User tidak bisa menaikkan role user lain ke level yang sama atau lebih tinggi

Middleware Autentikasi​

Auth Middleware​

Auth middleware memverifikasi token JWT atau session sebelum mengizinkan akses ke endpoint:

// Pseudocode middleware auth
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := extractBearerToken(c)
if token == "" {
// Cek session sebagai fallback
session := sessions.Default(c)
userID := session.Get("id")
if userID == nil {
sendError(c, 401, "Unauthorized", nil)
c.Abort()
return
}
} else {
// Validasi JWT
claims, err := validateToken(token)
if err != nil {
sendError(c, 401, "Invalid token", nil)
c.Abort()
return
}
c.Set("id", claims.UserId)
c.Set("role", claims.Role)
}
c.Next()
}
}

Admin Middleware​

Memeriksa apakah user memiliki role admin (β‰₯ 99) setelah autentikasi.

Tenant Middleware​

TenantMiddleware digunakan untuk mendukung multi-tenant. Middleware ini:

  1. Mengekstrak identitas tenant dari subdomain atau header
  2. Menyimpan tenant context di request
  3. Data query akan di-scope berdasarkan tenant

Alur Login Lengkap​

Flow Diagram​

User membuka LMS Codeverta
β”‚
β–Ό
Halaman Login (Email/PW atau WebAuthn)
β”‚
β–Ό
User memasukkan kredensial
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Backend memverifikasi: β”‚
β”‚ 1. Email terdaftar? β”‚
β”‚ 2. Password cocok? β”‚
β”‚ 3. Akun aktif? β”‚
β”‚ 4. Password login enabled? β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό
Success Failed
β”‚ β”‚
β–Ό β–Ό
Generate Access Response error
Token + Refresh dengan pesan
Token & simpan yang sesuai
session
β”‚
β–Ό
Response ke client:
- User info (safe)
- Access token
- Refresh token
β”‚
β–Ό
Client redirect ke
Dashboard sesuai role

Kondisi Gagal Login​

KondisiHTTP StatusPesan
Email tidak terdaftar400"Invalid parameters" / "User not found"
Password salah400"Invalid parameters"
Akun dinonaktifkan403"Your account has been deactivated..."
Password login disabled400"Password login has been disabled..."

Logout​

Endpoint: POST /api/auth/logout

Proses logout:

  1. Client menghapus access token dari memory
  2. Refresh token dihapus dari cookie/storage
  3. (Opsional) Backend bisa mem-blacklist token yang masih valid

Registrasi Pengguna Baru​

Endpoint: POST /api/auth/register

Ketentuan Registrasi​

  • Registrasi harus diaktifkan oleh admin (RegisterEnabled)
  • Registrasi password harus diaktifkan (PasswordRegisterEnabled)
  • Jika email verification aktif, user harus memverifikasi email terlebih dahulu

Request​

{
"username": "newuser",
"email": "newuser@example.com",
"password": "password123",
"display_name": "New User",
"verification_code": "123456" // (jika email verification enabled)
}

Response​

{
"success": true,
"message": "Participant successful",
"data": {
"username": "newuser",
"display_name": "New User",
"email": "newuser@example.com"
}
}

Manajemen Token​

Struktur JWT Payload​

{
"id": "uuid-user",
"username": "username",
"role": 1,
"iss": "gin-template",
"exp": 1700000000,
"iat": 1699999700
}

Verifikasi Token (di Backend)​

Backend memverifikasi token dengan:

  1. Memeriksa signature (HMAC-SHA256 dengan secret key)
  2. Memeriksa expiry (token kadaluarsa ditolak)
  3. Memeriksa issuer ("gin-template")
  4. Mengekstrak user ID dan role dari claims

FAQ Autentikasi​

Apakah saya bisa login di beberapa perangkat sekaligus?​

Ya, Anda bisa login di beberapa perangkat. Setiap perangkat akan mendapatkan token yang berbeda.

Kenapa saya tiba-tiba logout?​

Access token memiliki masa berlaku 5 menit. Jika refresh token juga kedaluwarsa (7 hari), Anda harus login ulang.

Apakah password saya aman?​

Password disimpan dalam bentuk hash (bukan plain text) menggunakan algoritma hashing yang aman. Backend tidak pernah menyimpan password asli.

Bagaimana WebAuthn bekerja?​

WebAuthn menggunakan public key cryptography. Perangkat Anda membuat pasangan kunci (public & private). Kunci public disimpan di server, kunci private tetap aman di perangkat Anda. Saat login, server memverifikasi bahwa Anda memiliki kunci private tanpa perlu mengirimkannya.

Apakah session saya tetap ada setelah refresh token kedaluwarsa?​

Tidak. Setelah refresh token kedaluwarsa (7 hari), Anda perlu login ulang untuk mendapatkan token baru.


Terakhir diperbarui: Juni 2026