Advanced Usage

Advanced Usage

Custom Configuration

JWT Configuration

Customize JWT settings for your application:

import { ElysiaAuth } from 'elysia-auth'
 
new Elysia()
  .use(ElysiaAuth({
    secret: process.env.AUTH_SECRET,
    session: {
      strategy: "jwt",
      maxAge: 30 * 24 * 60 * 60, // 30 days
      updateAge: 24 * 60 * 60, // 24 hours
    },
    jwt: {
      encode: async ({ token, secret }) => {
        // Custom encode logic
      },
      decode: async ({ token, secret }) => {
        // Custom decode logic
      }
    }
  }))

Cross-Origin Setup

Configure for frontend/backend separation:

new Elysia()
  .use(ElysiaAuth({
    callbacks: {
      redirect: async ({ baseUrl, url }) => {
        if (url.startsWith("http")) return url
        if (url.startsWith("/")) return `${baseUrl}${url}`
        return baseUrl
      }
    },
    pages: {
      signIn: "http://localhost:5173/signin",
      error: "http://localhost:5173/error"
    }
  }))

Custom Middleware Options

Auth Guard with Custom Failure Handler

import { authGuard } from 'elysia-auth'
 
app.group('/admin', app => app
  .use(authGuard({
    unauthorizedStatus: 403,
    unauthorizedMessage: "Access Denied",
    onFailure: (set) => {
      set.status = 403
      return {
        error: "Custom error message",
        redirect: "/login"
      }
    }
  }))
)

Protected Paths with Custom Authentication

import { protectPaths } from 'elysia-auth'
 
app.use(protectPaths(
  ['/api/private', '/admin'],
  {
    isAuthenticated: async ({ token, secret, salt }) => {
      // Custom authentication logic
      const user = await validateToken(token)
      return user
    },
    getUserData: async (authUser) => {
      // Custom user data transformation
      const userData = await enrichUserData(authUser)
      return userData
    }
  }
))

Error Handling

Custom Error Pages

new Elysia()
  .use(ElysiaAuth({
    pages: {
      error: '/auth/error',
      signIn: '/auth/signin',
      signOut: '/auth/signout'
    }
  }))

Error Callbacks

new Elysia()
  .use(ElysiaAuth({
    callbacks: {
      async error(error) {
        console.error('Auth error:', error)
        return `/auth/error?message=${error.message}`
      }
    }
  }))

Advanced Session Management

Custom Session Handling

app.group('/api', app => app
  .use(authGuard({
    getUserData: async (authUser) => {
      const user = await db.user.findUnique({
        where: { id: authUser.sub }
      })
      
      return {
        ...user,
        permissions: await getUserPermissions(user.id)
      }
    }
  }))
  .get('/profile', ({ session }) => {
    return {
      user: session.user,
      permissions: session.user.permissions
    }
  })
)

Session Validation

const validateSession = async ({ session, set }) => {
  if (!session.isAuthenticated) {
    set.status = 401
    return 'Not authenticated'
  }
 
  const user = session.user
  if (!user.emailVerified) {
    set.status = 403
    return 'Email not verified'
  }
}
 
app.get('/protected',
  ({ session, set }) => validateSession({ session, set }),
  () => 'Access granted'
)

TypeScript Integration

Custom User Type

import { JWT } from '@auth/core/jwt'
 
type CustomUser = JWT & {
  role: string
  permissions: string[]
}
 
app.group('/api', app => app
  .use(authGuard<CustomUser>({
    getUserData: async (authUser): Promise<CustomUser> => {
      // Transform auth user to custom user
      return {
        ...authUser,
        role: await getUserRole(authUser.sub),
        permissions: await getUserPermissions(authUser.sub)
      }
    }
  }))
)

Next Steps