For the complete documentation index, see llms.txt. This page is also available as Markdown.

Token

Setelah memiliki middleware auth sederhana (hanya cek panjang token), sekarang saatnya mengimplementasikan autentikasi yang sesungguhnya menggunakan JWT (JSON Web Token).

πŸ“‚ Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

πŸ”— github.com/jacky-htg/workshop/tree/main/17-token

17.1 Mengapa JWT?

Karakteristik
JWT
Session-based

State

Stateless (tidak perlu session di server)

Stateful (perlu menyimpan session)

Scalability

Sangat mudah (horizontal scaling)

Perlu session store bersama (Redis)

Mobile friendly

βœ… Ya

❌ Perlu cookie handling

Expiration

Built-in (exp claim)

Perlu implementasi sendiri

17.2 Alur Autentikasi dengan JWT

1. Client mengirim email + password ke /login
                    β”‚
                    β–Ό
2. Server validasi credential, buat JWT
                    β”‚
                    β–Ό
3. Server mengembalikan JWT ke client
                    β”‚
                    β–Ό
4. Client menyimpan token (localStorage / secure cookie)
                    β”‚
                    β–Ό
5. Client mengirim token di header Authorization: Bearer <token>
                    β”‚
                    β–Ό
6. Middleware Auth memvalidasi token
                    β”‚
                    β–Ό
7. Jika valid, request diteruskan ke handler

17.3 Konfigurasi Token

Tambahkan konfigurasi token di .env:

Variable
Deskripsi

TOKEN_SALT

Kunci rahasia untuk signing JWT (harus aman, jangan di-commit)

TOKEN_EXP

Masa berlaku token dalam jam (24 jam = 1 hari)

17.4 Library Token

Kita akan menggunakan library dari go-libs/token yang membungkus golang-jwt/jwt:

17.5 Update Konfigurasi

Tambahkan TokenConfig ke struct Config:

17.6 Repository: FindByEmail

Kita perlu mencari user berdasarkan email untuk proses login:

17.7 Service: Auths

Service ini bertanggung jawab untuk logika autentikasi:

17.8 DTO untuk Login

17.9 Handler: AuthHandler

17.10 Update Auth Middleware dengan Validasi JWT

Sekarang middleware auth yang sesungguhnya: memvalidasi JWT dan menyimpan claims ke context:

17.11 Update Routing

Tambahkan endpoint /login dan gunakan cfg.Token untuk auth service:

17.12 Testing Autentikasi

Login dengan credential salah

Response:

Login dengan credential benar

Response

Akses private route dengan token valid

Akses private route tanpa token

Response

Akses private route dengan token expired/invalid

17.13 Aliran Lengkap Autentikasi

Ringkasan Bab 17

Di bab ini kita telah belajar:

Komponen
File
Fungsi

JWT Library

go-libs/token

Generate & validate token

Token Config

config/config.go

Salt & expiration

Auth Service

service/auths.go

Login logic

Auth Handler

handler/auth_handler.go

HTTP endpoint /login

Auth Middleware

middleware/auth_middleware.go

Validate token, inject to context

Manfaat yang kita peroleh:

  • βœ… Autentikasi stateless (tidak perlu session storage)

  • βœ… Password tidak pernah dikirim dalam response

  • βœ… Token memiliki masa berlaku (expiration)

  • βœ… Claims dapat diakses di handler via context

  • βœ… Middleware auth sekarang benar-benar memvalidasi JWT

Yang akan datang:

  • Saat ini semua user dengan token valid bisa mengakses semua endpoint

  • Bab selanjutnya: Role Based Access Controller (Otorisasi) – membatasi akses berdasarkan role user

Last updated