Skip to content

Architecture

The Nuxt Users module is built with a layered architecture that provides authentication, authorization, and user management capabilities for Nuxt applications. This document explains the internal architecture, components, and data flow.

Overview

The module follows a modular architecture with clear separation of concerns:

  • Module Layer: Nuxt module configuration and setup
  • API Layer: RESTful HTTP endpoints for user operations
  • Service Layer: Business logic and data operations
  • Data Layer: Database abstraction and utilities
  • Security Layer: Authentication and authorization middleware
  • Client Layer: Vue components and composables

Core Components

1. Module Registration (src/module.ts)

The main module file handles:

  • Configuration Management: Merges user options with defaults
  • Runtime Config Setup: Configures server and client-side options
  • Route Registration: Dynamically registers API endpoints
  • Component Registration: Auto-registers Vue components
  • Middleware Setup: Configures authentication middleware
  • Database Integration: Sets up Nitro database configuration

Key responsibilities:

typescript
// API endpoint registration with configurable base path
addServerHandler({
  route: `${base}/session`,
  method: 'post',
  handler: resolver.resolve('./runtime/server/api/nuxt-users/session/index.post')
})

// Nitro database configuration
nitroConfig.database.default = {
  connector: nitroConnector,
  options: connectorOptions
}

2. Database Layer

Database Abstraction (src/runtime/server/utils/db.ts)

Provides unified database access across multiple database types:

  • Connector Management: Dynamic loading of database connectors
  • Connection Pooling: Efficient database connection management
  • Error Handling: Graceful handling of connection failures

Supported databases:

  • SQLite (better-sqlite3)
  • MySQL (mysql2)
  • PostgreSQL (pg)

Database Utilities

Table Creation: Database-specific SQL for table creation

typescript
// SQLite example
CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  email TEXT NOT NULL UNIQUE,
  name TEXT NOT NULL,
  password TEXT NOT NULL,
  role TEXT NOT NULL DEFAULT 'user',
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)

Migration System: Tracks and manages database schema changes

  • Migrations table for version tracking
  • CLI commands for database operations
  • Rollback capabilities

3. Authentication System

Token-Based Authentication

The module uses personal access tokens for authentication:

Token Storage: Tokens stored in personal_access_tokens table

typescript
interface PersonalAccessToken {
  id: number
  tokenable_type: string  // 'user'
  tokenable_id: number    // user ID
  name: string           // 'auth_token'
  token: string          // hashed token
  expires_at?: string    // optional expiration
  last_used_at?: string  // tracking usage
}

Token Lifecycle:

  1. Creation: Generated during login with configurable expiration
  2. Validation: Checked on each authenticated request
  3. Usage Tracking: last_used_at updated on access
  4. Cleanup: Expired tokens automatically removed

Password Security

Hashing: Uses bcrypt with salt rounds for password storage

typescript
const hashedPassword = await bcrypt.hash(userData.password, 10)

Validation: Configurable password strength requirements

  • Minimum length
  • Character type requirements (uppercase, lowercase, numbers, special)
  • Common password prevention

4. Authorization System

Role-Based Access Control (RBAC)

Permission Structure:

typescript
type Permission = string | {
  path: string
  methods: HttpMethod[]
}

// Configuration example
permissions: {
  admin: ['*'],                    // Full access
  user: ['/profile', '/api/nuxt-users/me'],
  moderator: [
    { path: '/api/users/*', methods: ['GET', 'PATCH'] },
    '/admin/dashboard'
  ]
}

Authorization Flow:

  1. Token Extraction: Get token from cookies
  2. User Resolution: Find user from token
  3. Permission Check: Match request path against user permissions
  4. Access Decision: Allow/deny based on permissions

Middleware Architecture

Server Middleware (authorization.server.ts):

  • Runs on every server request
  • Handles API route protection
  • Returns 401/403 for unauthorized access

Client Middleware (authorization.client.ts):

  • Runs on client-side navigation
  • Handles page-level protection
  • Redirects to login for protected routes

5. API Layer

RESTful Endpoints

Authentication Endpoints:

  • POST /api/nuxt-users/session - Login
  • DELETE /api/nuxt-users/session - Logout

User Management:

  • GET /api/nuxt-users - List users
  • POST /api/nuxt-users - Create user
  • GET /api/nuxt-users/:id - Get user
  • PATCH /api/nuxt-users/:id - Update user
  • DELETE /api/nuxt-users/:id - Delete user

Profile Management:

  • GET /api/nuxt-users/me - Current user
  • PATCH /api/nuxt-users/me - Update profile

Password Management:

  • PATCH /api/nuxt-users/password - Change password
  • POST /api/nuxt-users/password/forgot - Request reset
  • POST /api/nuxt-users/password/reset - Reset password

Request/Response Flow

mermaid
graph TD
    A[Client Request] --> B[Server Middleware]
    B --> C{Authenticated?}
    C -->|No| D[401 Unauthorized]
    C -->|Yes| E{Authorized?}
    E -->|No| F[403 Forbidden]
    E -->|Yes| G[API Handler]
    G --> H[Business Logic]
    H --> I[Database Operation]
    I --> J[Response]

6. Service Layer

User Service (src/runtime/server/utils/user.ts)

Core user operations:

  • User CRUD: Create, read, update, delete operations
  • Authentication: Login validation and token management
  • Password Management: Hashing, validation, reset functionality
  • Token Management: Creation, validation, cleanup

Email Service

Password Reset Flow:

  1. User requests password reset
  2. Generate secure reset token
  3. Send email with reset link
  4. Validate token on reset
  5. Update password and invalidate token

7. Client Layer

Vue Components

Authentication Components:

  • NUsersLoginForm: Login form with validation
  • NUsersLogoutLink: Logout functionality
  • NUsersResetPasswordForm: Password reset form

User Management Components:

  • NUsersList: User listing with pagination
  • NUsersUserCard: User display card
  • NUsersUserForm: User creation/editing form

Utility Components:

  • NUsersPasswordStrengthIndicator: Real-time password validation
  • NUsersProfileInfo: User profile display

Composables

Client-side Authentication (useAuthentication.ts):

typescript
const { user, login, logout, isAuthenticated } = useAuthentication()

Server-side Authentication (useServerAuth.ts):

typescript
const { getCurrentUser } = useServerAuth()
const user = await getCurrentUser(event)

8. Configuration System

Runtime Configuration

Server Configuration:

  • Database connection settings
  • Authentication options
  • Email configuration
  • Security settings

Client Configuration:

  • Password validation rules
  • API endpoints
  • Public authentication settings

Environment-based Configuration

typescript
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['nuxt-users'],
  nuxtUsers: {
    connector: {
      name: process.env.DB_TYPE || 'sqlite',
      options: {
        host: process.env.DB_HOST,
        // ... other options
      }
    }
  }
})

Data Flow

Authentication Flow

mermaid
sequenceDiagram
    participant C as Client
    participant M as Middleware
    participant A as API
    participant D as Database
    
    C->>A: POST /session (email, password)
    A->>D: Find user by email
    D-->>A: User data
    A->>A: Validate password
    A->>D: Create access token
    D-->>A: Token created
    A->>C: Set auth cookie + user data
    
    C->>M: Subsequent request
    M->>M: Extract token from cookie
    M->>D: Validate token
    D-->>M: User data
    M->>A: Continue with user context

Authorization Flow

mermaid
sequenceDiagram
    participant R as Request
    participant M as Middleware
    participant P as Permissions
    participant H as Handler
    
    R->>M: HTTP Request
    M->>M: Extract user from token
    M->>P: Check permissions
    P->>P: Match path against user role
    P-->>M: Permission result
    
    alt Authorized
        M->>H: Forward request
        H-->>R: Response
    else Unauthorized
        M-->>R: 401/403 Error
    end

Security Considerations

Token Security

  • Tokens are hashed before storage
  • Configurable expiration times
  • Automatic cleanup of expired tokens
  • Secure cookie settings

Password Security

  • bcrypt hashing with salt
  • Configurable strength requirements
  • Protection against common passwords

Authorization Security

  • Path-based permission matching
  • Method-specific permissions
  • Wildcard support for flexible rules
  • Whitelist approach for public routes

Performance Optimizations

Database Optimizations

  • Connection pooling
  • Prepared statements via db0
  • Efficient token cleanup
  • Indexed columns for fast lookups

Caching Strategy

  • Runtime config caching
  • Component auto-registration
  • Middleware optimization

Memory Management

  • Automatic token cleanup
  • Efficient user lookups
  • Minimal data transfer

Testing Architecture

The module includes comprehensive testing:

Unit Tests

  • API endpoint testing
  • Middleware functionality
  • Utility function validation
  • Permission system testing

Integration Tests

  • End-to-end authentication flows
  • Database operations
  • Multi-database support

Test Infrastructure

  • Database-agnostic test setup
  • Mock implementations
  • Cleanup utilities
  • Environment configuration

This architecture provides a robust, scalable, and secure foundation for user authentication and management in Nuxt applications.

Released under the MIT License.