Skip to main content

JWT Token Utils

Dokumentasi utility functions untuk JWT token generation dan verification.

Overview​

Package utils menyediakan functions untuk mengelola JWT (JSON Web Token) untuk autentikasi.

Constants​

var jwtKey = []byte("your_secret_key")
warning

Ganti your_secret_key dengan secret key yang aman di production. Simpan di environment variable.

Claims Struct​

type Claims struct {
UserID string
NoPegawai string
Nama string
Email string
TipePegawai string
HakAksesID string
jwt.StandardClaims
}

Fields​

FieldTypeDeskripsi
UserIDstringUUID pengguna
NoPegawaistringNomor pegawai (NRK/NPTT)
NamastringNama lengkap
EmailstringEmail pengguna
TipePegawaistringTipe pegawai (pns/non-pns/unit-kerja)
HakAksesIDstringID hak akses
StandardClaimsjwt.StandardClaimsStandard JWT claims (exp, iat, etc)

Functions​

GenerateToken​

Membuat JWT token baru dengan claims.

func GenerateToken(userID string, noPegawai, nama, email, tipePegawai, hakAksesID string) (string, error)

Parameters​

ParameterTypeDeskripsi
userIDstringUUID pengguna
noPegawaistringNomor pegawai
namastringNama lengkap
emailstringEmail
tipePegawaistringTipe pegawai
hakAksesIDstringID hak akses

Return​

  • string - JWT token
  • error - Error jika gagal generate

Example​

token, err := utils.GenerateToken(
user.ID,
user.NoPegawai,
user.Nama,
user.Email,
user.TipePegawai,
user.HakAksesID,
)
if err != nil {
return helpers.NewInternalError("Failed to generate token")
}

VerifyToken​

Memverifikasi dan parse JWT token.

func VerifyToken(tokenString string) (*Claims, error)

Parameters​

ParameterTypeDeskripsi
tokenStringstringJWT token (tanpa prefix Bearer)

Return​

  • *Claims - Parsed claims jika valid
  • error - Error jika token invalid/expired

Example​

claims, err := utils.VerifyToken(tokenString)
if err != nil {
return helpers.NewUnauthorized("Invalid token")
}

// Access claims
userID := claims.UserID
nama := claims.Nama

Token Expiration​

Default token expiration adalah 24 jam dari waktu pembuatan.

expirationTime := time.Now().Add(24 * time.Hour)

JWT Structure​

Token yang di-generate memiliki format:

xxxxx.yyyyy.zzzzz
PartDeskripsi
Header (xxxxx)Algorithm dan token type
Payload (yyyyy)Claims data
Signature (zzzzz)Verification signature

Decoded Payload Example​

{
"UserID": "550e8400-e29b-41d4-a716-446655440000",
"NoPegawai": "123456",
"Nama": "John Doe",
"Email": "john@example.com",
"TipePegawai": "pns",
"HakAksesID": "admin",
"exp": 1737590400
}

Security Best Practices​

  1. Secret Key Management

    // ❌ Bad - hardcoded
    var jwtKey = []byte("your_secret_key")

    // ✅ Good - from environment
    var jwtKey = []byte(os.Getenv("JWT_SECRET_KEY"))
  2. Token Rotation - Implementasikan refresh token

  3. Short Expiration - Untuk high-security, gunakan expiration lebih pendek

  4. HTTPS Only - Selalu kirim token melalui HTTPS

  5. HttpOnly Cookie - Simpan token di httpOnly cookie, bukan localStorage

Error Handling​

claims, err := utils.VerifyToken(tokenString)
if err != nil {
switch {
case errors.Is(err, jwt.ErrSignatureInvalid):
// Token signature invalid
case errors.Is(err, jwt.ErrTokenExpired):
// Token expired
default:
// Other error
}
}