Admin Authentication
Overview
Admin authentication in VCEcom uses a secure, session-based system with refresh token rotation, optional 2FA, and comprehensive activity logging.
Features
- Session-Based Authentication: Stateful sessions stored in database
- Refresh Token Rotation: New refresh token issued on each refresh, old token invalidated
- Multi-Device Support: Admins can have multiple active sessions
- 2FA Support: Optional TOTP-based two-factor authentication
- Activity Logging: All admin actions logged for audit trail
- Rate Limiting: Redis-based brute force protection
- Argon2id Password Hashing: Modern, secure password hashing
Session Lifecycle
JWT + Refresh Token Rotation
Access Token
- Lifetime: 15 minutes (configurable via
ADMIN_ACCESS_TOKEN_EXPIRES_IN) - Storage: httpOnly cookie (
admin_access_token) - Contains:
sub,email,role,sessionId,type: "admin"
Refresh Token
- Lifetime: 90 days (configurable via
ADMIN_REFRESH_TOKEN_EXPIRY_DAYS) - Storage: httpOnly cookie (
admin_refresh_token) - Rotation: New token issued on each refresh, old token immediately invalidated
- Security: Stored as Argon2 hash in database
Token Rotation Flow
MFA Flow
When 2FA is enabled, login requires an additional verification step:
Activity Logging
All admin actions are automatically logged to the admin_activity_logs table:
- Automatic Logging: Using
@LogActivitydecorator andActivityLoggingInterceptor - Logged Fields: Admin ID, action, entity ID, metadata, IP address, user agent, timestamp
- Sensitive Data Filtering: Passwords, tokens, and secrets are automatically excluded
Example Log Entry
{
"adminId": "uuid",
"action": "product.create",
"entityId": "product-123",
"metadata": {
"title": "New Product",
"price": 999.99
},
"ipAddress": "192.168.1.1",
"userAgent": "Mozilla/5.0...",
"createdAt": "2025-12-18T00:00:00Z"
}
Security Model
Password Security
- Hashing: Argon2id (recommended for admins)
- Migration: Automatic migration from bcrypt to Argon2id on login
- Verification: Supports both algorithms during transition
Session Security
- Session Validation: Every request validates session exists and is not expired
- Session Revocation: Admins can revoke individual or all sessions
- Token Reuse Detection: Refresh token rotation detects and invalidates reused tokens
Rate Limiting
- Redis-Based: IP-based rate limiting for login attempts
- Default Limit: 10 attempts per 10 minutes
- Configurable: Via
ADMIN_LOGIN_RATE_LIMITandADMIN_LOGIN_RATE_WINDOW
API Endpoints
Authentication
POST /admin/auth/login- Admin loginPOST /admin/auth/2fa/verify- Verify 2FA and complete loginPOST /admin/auth/refresh- Refresh access tokenDELETE /admin/auth/logout- Logout current deviceDELETE /admin/auth/logout/all- Logout all devices
Session Management
GET /admin/auth/sessions- List active sessionsDELETE /admin/auth/sessions/:sessionId- Revoke a sessionGET /admin/auth/me- Get current admin info
2FA Management
GET /admin/auth/2fa/status- Check 2FA statusPOST /admin/auth/2fa/generate-secret- Generate TOTP secretPOST /admin/auth/2fa/enable- Enable 2FAPOST /admin/auth/2fa/disable- Disable 2FAPOST /admin/auth/2fa/verify- Verify 2FA code
Database Schema
admin_sessions
Stores active admin sessions:
CREATE TABLE admin_sessions (
id UUID PRIMARY KEY,
admin_id UUID NOT NULL REFERENCES users(id),
refresh_token_hash TEXT NOT NULL UNIQUE,
device_id TEXT NOT NULL,
user_agent TEXT,
ip_address TEXT,
created_at TIMESTAMP NOT NULL,
expires_at TIMESTAMP NOT NULL,
last_used_at TIMESTAMP NOT NULL
);
admin_activity_logs
Append-only log of admin actions:
CREATE TABLE admin_activity_logs (
id UUID PRIMARY KEY,
admin_id UUID REFERENCES users(id),
action TEXT NOT NULL,
entity_id TEXT,
metadata JSONB,
ip_address TEXT,
user_agent TEXT,
created_at TIMESTAMP NOT NULL
);
admin_2fa
Stores 2FA configuration:
CREATE TABLE admin_2fa (
admin_id UUID PRIMARY KEY REFERENCES users(id),
secret TEXT NOT NULL,
backup_codes TEXT[],
enabled BOOLEAN NOT NULL DEFAULT false
);
Configuration
Environment Variables
# Token Expiration
ADMIN_ACCESS_TOKEN_EXPIRES_IN=15m
ADMIN_REFRESH_TOKEN_EXPIRY_DAYS=90
ADMIN_SESSION_EXPIRY_DAYS=30
# Rate Limiting
ADMIN_LOGIN_RATE_LIMIT=10
ADMIN_LOGIN_RATE_WINDOW=600
# App Name (for 2FA QR codes)
APP_NAME=VCEcom Admin
Developer Notes
Adding Activity Logging
Use the @LogActivity decorator on controller methods:
@Post()
@LogActivity("product.create")
async create(@Body() dto: CreateProductDto) {
return this.productsService.create(dto);
}
Custom Entity ID
Specify a custom parameter name for entity ID:
@Put(":id")
@LogActivity("product.update", "id")
async update(@Param("id") id: string, @Body() dto: UpdateProductDto) {
return this.productsService.update(id, dto);
}
Edge Cases
- Expired Sessions: Automatically cleaned up on validation
- Token Reuse: Detected during refresh, session invalidated
- 2FA Backup Codes: Single-use, removed after verification
- Concurrent Logins: Multiple sessions allowed per admin
- Session Limit: No hard limit, but admins can revoke old sessions
Integration Points
- JwtStrategy: Validates admin sessions on every request
- RolesGuard: Enforces role-based access control
- ActivityLoggingInterceptor: Automatically logs admin actions
- RedisStoreService: Used for rate limiting