Belajar ElysiaJS - JWT Authentication & Session Management
Episode 12 of 21

Belajar ElysiaJS - JWT Authentication & Session Management

Mengimplementasikan autentikasi di ElysiaJS: setup JWT dengan plugin @elysiajs/jwt, cookie-based session management, bearer token pattern, dan guard pattern untuk melindungi route dari akses tidak sah.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 11 kita mengamankan API dengan CORS, security headers, dan rate limiting, pada episode ini kita akan membangun lapisan autentikasi — mekanisme untuk memverifikasi identitas user sebelum mengakses resource yang dilindungi.

JWT di ElysiaJS

Setup JWT

Install JWT plugin
bun add @elysiajs/jwt
Setup JWT dengan secret
import { Elysia } from 'elysia'
import jwt from '@elysiajs/jwt'
 
const app = new Elysia()
  .use(jwt({
    name: 'jwt',
    secret: process.env.JWT_SECRET,
  }))
  .listen(3000)

Sign dan Verify Token

Sign dan verify JWT token
.post('/auth/login', async ({ jwt, body }) => {
  const user = await authenticateUser(body.email, body.password)
  if (!user) return { error: 'Invalid credentials' }
 
  const token = await jwt.sign({
    sub: user.id,
    name: user.name,
    exp: '7d',
  })
 
  return { token }
}, {
  body: t.Object({
    email: t.String({ format: 'email' }),
    password: t.String(),
  })
})

Protecting Routes dengan JWT

Protected route dengan JWT verification
.get('/profile', async ({ jwt, headers }) => {
  const token = headers.authorization?.split(' ')[1]
  if (!token) return { error: 'No token provided' }
 
  const payload = await jwt.verify(token)
  if (!payload) return { error: 'Invalid token' }
 
  return { userId: payload.sub, name: payload.name }
})
Session cookie setelah login
.post('/auth/login', async ({ jwt, cookie, body }) => {
  const user = await authenticateUser(body.email, body.password)
  if (!user) return { error: 'Invalid credentials' }
 
  const token = await jwt.sign({ sub: user.id, exp: '7d' })
 
  cookie.session.set(token, {
    httpOnly: true,
    secure: true,
    sameSite: 'lax',
    path: '/',
  })
 
  return { message: 'Logged in' }
})
Membaca session dari cookie
.get('/profile', async ({ jwt, cookie }) => {
  const token = cookie.session.value
  if (!token) return { error: 'Not authenticated' }
 
  const payload = await jwt.verify(token)
  if (!payload) return { error: 'Invalid session' }
 
  return { userId: payload.sub }
})

Bearer Token Pattern

Plugin Bearer

Install bearer plugin
bun add @elysiajs/bearer
Bearer token extraction
import bearer from '@elysiajs/bearer'
 
const app = new Elysia()
  .use(bearer())
  .get('/protected', async ({ bearer }) => {
    if (!bearer) return { error: 'No bearer token' }
    // verify bearer token
    return { message: 'Access granted' }
  })

Guard Pattern

Guard untuk Group Routes

guard() memungkinkan kalian menerapkan auth ke grup routes secara bersamaan:

Guard pattern untuk group routes
const checkAuth = async ({ jwt, headers }: any) => {
  const token = headers.authorization?.split(' ')[1]
  if (!token) throw new Error('Unauthorized')
  const payload = await jwt.verify(token)
  if (!payload) throw new Error('Invalid token')
  return { userId: payload.sub }
}
 
const app = new Elysia()
  .use(jwt({ name: 'jwt', secret: process.env.JWT_SECRET }))
  .guard({ beforeHandle: checkAuth }, (app) =>
    app
      .get('/profile', ({ userId }) => ({ userId }))
      .get('/settings', ({ userId }) => ({ userId }))
      .post('/update', ({ userId, body }) => ({ userId, ...body }))
  )

Derive untuk User Global

Global user context dengan derive
app.derive(async ({ jwt, headers }) => {
  const token = headers.authorization?.split(' ')[1]
  const user = token ? await jwt.verify(token) : null
  return { user }
})

Tip

Gunakan derive() untuk menambahkan user ke context secara global, lalu guard() untuk apply auth ke grup routes. Kombinasi ini membuat autentikasi bersih dan mudah dirawat.

Penutup

Pada episode 12 ini, kalian telah memahami autentikasi di ElysiaJS — dari JWT hingga cookie-based session dan guard pattern.

Inti yang harus dibawa pulang:

  • JWT plugin menyediakan jwt.sign() dan jwt.verify() untuk token management.
  • Cookie-based session: simpan token di httpOnly cookie untuk keamanan.
  • Bearer token pattern untuk API yang menggunakan Authorization header.
  • Guard pattern menerapkan auth ke grup routes secara bersamaan.

Di episode 13 selanjutnya kita akan memahami OAuth dan social login — integrasi GitHub OAuth dan Google OAuth untuk login tanpa password. Sampai jumpa di episode 13!