Skip to content

lazy-js/auth

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

22 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

@lazy-js/auth

A comprehensive authentication and authorization package built on top of Keycloak, providing a unified API for user management, authentication, and role-based access control across multiple clients and applications.

πŸ—οΈ Architecture Overview

This package implements a multi-tenant authentication system that bridges Keycloak's identity management capabilities with a local MongoDB database for enhanced user data management and client-specific configurations.

Core Components

  • LazyAuth: Main orchestrator class that manages the entire authentication lifecycle
  • Realm Management: Dynamic realm creation and configuration for different clients
  • User Management: Comprehensive user registration, login, and profile management
  • Keycloak Integration: Seamless integration with Keycloak Admin API and public client APIs
  • Multi-Client Support: Support for multiple authentication clients with different configurations

πŸš€ Key Features

Authentication Methods

  • Multi-method Authentication: Username, email, or phone number based login
  • Flexible Registration: Configurable registration flows per client
  • Token Management: JWT access and refresh token handling
  • Password Management: Secure password updates and validation

Authorization & Security

  • Role-Based Access Control (RBAC): Hierarchical role management
  • Group Management: User grouping with inherited permissions
  • Client-Specific Permissions: Isolated permission systems per client
  • Token Validation: Comprehensive access token and role validation

Multi-Tenancy

  • Client Isolation: Separate authentication flows per client
  • Custom Attributes: Client-specific user attributes
  • Shared Attributes: Cross-client user data sharing
  • Flexible Configuration: Per-client authentication settings

πŸ“¦ Dependencies

Core Dependencies

  • @keycloak/keycloak-admin-client: Keycloak administration
  • @lazy-js/error-guard: Centralized error handling
  • @lazy-js/server: Express.js server framework
  • @lazy-js/utils: Utility functions
  • jose: JWT token handling
  • mongoose: MongoDB object modeling

Development Dependencies

  • typescript: TypeScript compilation
  • vitest: Testing framework
  • supertest: HTTP testing utilities

πŸ›οΈ System Architecture

High-Level Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Client Apps   β”‚    β”‚   LazyAuth      β”‚    β”‚   Keycloak      β”‚
β”‚                 │◄──►│   Package       │◄──►│   Server        β”‚
β”‚ - Web Apps      β”‚    β”‚                 β”‚    β”‚                 β”‚
β”‚ - Mobile Apps   β”‚    β”‚ - User Mgmt     β”‚    β”‚ - Identity Mgmt β”‚
β”‚ - APIs          β”‚    β”‚ - Auth Flow     β”‚    β”‚ - Token Issuanceβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚ - Role Mgmt     β”‚    β”‚ - User Storage  β”‚
                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
                                β–Ό
                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                       β”‚   MongoDB       β”‚
                       β”‚                 β”‚
                       β”‚ - User Profiles β”‚
                       β”‚ - Client Config β”‚
                       β”‚ - Custom Data   β”‚
                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Module Structure

src/
β”œβ”€β”€ modules/
β”‚   β”œβ”€β”€ kcApi/           # Keycloak API integration
β”‚   β”‚   β”œβ”€β”€ services/    # Admin and public client APIs
β”‚   β”‚   └── types/       # API type definitions
β”‚   β”œβ”€β”€ Realm/           # Realm and client management
β”‚   β”‚   β”œβ”€β”€ src/         # Core realm classes
β”‚   β”‚   └── types/       # Realm type definitions
β”‚   β”œβ”€β”€ RealmBuilder/    # Dynamic realm creation
β”‚   β”œβ”€β”€ RealmManipulator/# Realm operations
β”‚   └── User/            # User management
β”‚       β”œβ”€β”€ controller/  # HTTP endpoints
β”‚       β”œβ”€β”€ service/     # Business logic
β”‚       β”œβ”€β”€ model/       # Data models
β”‚       β”œβ”€β”€ repository/  # Data access
β”‚       └── validator/   # Input validation
β”œβ”€β”€ database/            # Database connection
β”œβ”€β”€ utils/              # Utility functions
└── types/              # Global type definitions

πŸ”§ Installation

npm install @lazy-js/auth

πŸ“– Usage

Basic Setup

import { LazyAuth, Realm, Client, Group, User, createRolesTree } from '@lazy-js/auth';

// Define roles hierarchy
const roles = createRolesTree([
    {
        name: 'admin',
        childRoles: [{ name: 'user-management' }, { name: 'content-management' }],
    },
]);

// Create groups
const adminGroup = new Group('admin-group', true).addRoles(roles).addAttribute('permissions', 'all');

// Create client configuration
const client = new Client('my-app', 'my-app-client')
    .setAuthConfig(
        new ClientAuthConfig(['email', 'username'])
            .setRegisterConfig({ status: 'public', verified: false })
            .setLoginConfig({ status: 'enabled' }),
    )
    .addGroup(adminGroup);

// Create realm
const realm = new Realm('my-realm').addClient(client).addUser(
    new User({
        username: 'admin',
        password: 'secure-password',
        method: 'username',
        group: adminGroup,
    }),
);

// Initialize LazyAuth
const auth = new LazyAuth(
    {
        keycloakServiceUrl: 'http://localhost:8080',
        keycloakAdminPassword: 'admin-password',
        localMongoDbURL: 'mongodb://localhost:27017/auth-db',
        logKeycloakInfo: true,
    },
    {
        config: {
            port: 3000,
            serviceName: 'auth-service',
            routerPrefix: '/api/v1',
        },
    },
    realm,
    notificationSdk,
);

// Start the service
await auth.start();

API Endpoints

The package automatically exposes the following endpoints for each configured client:

Authentication Endpoints

  • POST /{client-name}/register - User registration
  • POST /{client-name}/login - User login
  • POST /{client-name}/validate-access-token - Token validation
  • POST /{client-name}/validate-role - Role validation
  • POST /{client-name}/refresh-access-token - Token refresh

User Management Endpoints

  • PUT /{client-name}/me/password - Update password
  • PUT /{client-name}/me/verify - Verify user account

πŸ” Security Features

Authentication Security

  • JWT Token Management: Secure token generation and validation
  • Password Hashing: Bcrypt-based password security
  • Multi-Factor Support: Email/phone verification capabilities
  • Session Management: Automatic token refresh and expiration

Authorization Security

  • Role-Based Access: Hierarchical permission system
  • Client Isolation: Separate permission contexts per client
  • Token Validation: Comprehensive token integrity checks
  • Input Validation: Zod-based request validation

Data Security

  • Encrypted Storage: Sensitive data encryption in MongoDB
  • Secure Communication: HTTPS-ready API endpoints
  • Error Handling: Secure error responses without data leakage

πŸ§ͺ Testing

# Run tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage
npm run test:coverage

πŸ“Š Monitoring & Logging

The package includes comprehensive logging for:

  • Authentication events
  • Authorization decisions
  • Database operations
  • Keycloak API interactions
  • Error tracking and debugging

πŸ”„ Error Handling

The system uses a centralized error handling approach with:

  • Validation Errors: Input validation failures
  • Authentication Errors: Login/registration failures
  • Authorization Errors: Permission denied scenarios
  • System Errors: Infrastructure and service failures

πŸš€ Performance Considerations

  • Connection Pooling: Optimized database connections
  • Token Caching: Efficient token validation
  • Async Operations: Non-blocking I/O throughout
  • Memory Management: Efficient resource utilization

πŸ“ˆ Scalability

  • Horizontal Scaling: Stateless design supports multiple instances
  • Database Sharding: MongoDB sharding support
  • Load Balancing: Ready for load balancer deployment
  • Microservice Ready: Designed for microservice architectures

πŸ”§ Configuration

Environment Variables

  • KEYCLOAK_SERVICE_URL: Keycloak server URL
  • KEYCLOAK_ADMIN_PASSWORD: Admin password
  • MONGODB_URL: MongoDB connection string
  • SERVICE_PORT: API server port
  • SERVICE_NAME: Service identifier

Client Configuration

Each client can be configured with:

  • Primary authentication fields (email, username, phone)
  • Registration policies (public/private, verification requirements)
  • Login policies (enabled/disabled)
  • Custom user attributes
  • Group and role assignments

πŸ“ License

ISC License - see LICENSE file for details.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published