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
}
}