@dani/auth-system (1.0.0)
Installation
@dani:registry=npm install @dani/auth-system@1.0.0"@dani/auth-system": "1.0.0"About this package
Auth System
Sistema de autenticación reutilizable con soporte para login local (email/contraseña) y OIDC (OpenID Connect).
Características
- ✅ Autenticación local con email y contraseña (bcrypt)
- ✅ Autenticación OIDC (OpenID Connect)
- ✅ JWT tokens para sesiones
- ✅ Logs de autenticación
- ✅ Middleware de autenticación para Express
- ✅ Componentes React reutilizables
- ✅ Configuración flexible y extensible
Instalación
Configurar el Registry de Forgejo
Primero, configura npm para usar el Package Registry de Forgejo:
# Configurar el registry para el scope @dani
npm config set @dani:registry https://git.martinezrodriguez.es/api/packages/dani/npm/
# Si el paquete es privado, configura el token de autenticación
npm config set -- '//git.martinezrodriguez.es/api/packages/dani/npm/:_authToken' "TU_TOKEN_AQUI"
Instalar el Paquete
npm install @dani/auth-system
Nota: Necesitarás un token de acceso personal de Forgejo con permisos read:package si el paquete es privado. Ver PUBLISH.md para más detalles.
Dependencias
Este paquete requiere las siguientes dependencias peer:
react^18.0.0react-router-dom^6.0.0
Configuración Backend
1. Inicializar Base de Datos
Primero, inicializa las tablas necesarias en tu base de datos:
import Database from 'better-sqlite3';
import { initAuthTables } from '@dani/auth-system/db';
const db = new Database('tu-base-de-datos.db');
initAuthTables(db);
2. Configurar Rutas de Autenticación
import express from 'express';
import { createAuthRoutes } from '@dani/auth-system/backend';
import Database from 'better-sqlite3';
const app = express();
const db = new Database('tu-base-de-datos.db');
// Configurar rutas de autenticación
const authRoutes = createAuthRoutes({
db: db,
jwtSecret: process.env.JWT_SECRET,
// Opcional: personalizar callback URL
callbackBaseUrl: 'https://tu-dominio.com',
// Opcional: personalizar ruta de login del frontend
frontendLoginPath: '/login'
});
app.use('/api/auth', authRoutes);
3. Configurar Middleware de Autenticación
import { createAuthMiddleware } from '@dani/auth-system/backend';
// Crear middleware con tu JWT secret
const authenticateToken = createAuthMiddleware({
jwtSecret: process.env.JWT_SECRET
});
// Usar en rutas protegidas
app.use('/api/protected', authenticateToken);
Configuración Frontend
1. Configurar Provider de Autenticación
import { AuthProvider } from '@dani/auth-system/frontend';
import { setGetApiUrl } from '@dani/auth-system/frontend';
// Opcional: configurar URL del API personalizada
setGetApiUrl(() => 'http://localhost:3000/api');
function App() {
return (
<AuthProvider
// Opcional: función para cargar preferencias del usuario
loadUserPreferences={async (userData, setUser) => {
// Tu lógica personalizada aquí
const prefs = await fetchUserPreferences(userData.id);
setUser({ ...userData, ...prefs });
}}
// Opcional: función para actualizar preferencias
updateUserPreferences={async (prefs) => {
// Tu lógica personalizada aquí
}}
>
{/* Tu aplicación */}
</AuthProvider>
);
}
2. Configurar Rutas
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { Login, ProtectedRoute } from '@dani/auth-system/frontend';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/login" element={<Login
appName="Mi App"
appSubtitle="Inicia sesión para continuar"
redirectPath="/dashboard"
/>} />
<Route path="/dashboard" element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
} />
</Routes>
</BrowserRouter>
);
}
Variables de Entorno
Requeridas
JWT_SECRET- Secreto para firmar y verificar tokens JWT
Opcionales (para OIDC)
OAUTH_PROVIDER_NAME- Nombre del proveedor OAuth (se mostrará en el botón de login)OAUTH_WELLKNOWN_URL- URL del well-known endpoint OIDC (ej:https://auth.proveedor.com/.well-known/openid-configuration)OAUTH_CLIENT_ID- Client ID de OAuthOAUTH_CLIENT_SECRET- Client Secret de OAuthOAUTH_ALLOW_CREATE_USER- Permitir crear usuarios nuevos vía OIDC (true/false, default:false)OAUTH_DISABLE_LOCAL_LOGIN- Deshabilitar login local (true/false, default:false)
API Reference
Backend
createAuthRoutes(options)
Crea un router de Express con las rutas de autenticación.
Opciones:
db(Database, requerido) - Instancia de better-sqlite3jwtSecret(string, requerido) - Secreto para JWTgetClientIp(Function, opcional) - Función personalizada para obtener IPlogAuthAttempt(Function, opcional) - Función personalizada para logscallbackBaseUrl(string, opcional) - URL base para callback OIDCfrontendLoginPath(string, opcional) - Ruta de login del frontend (default: '/login')
Rutas creadas:
GET /config- Configuración pública OAuthGET /oidc/init- Iniciar flujo OIDCGET /oidc/callback- Callback OIDCPOST /login- Login localGET /verify- Verificar tokenGET /logs- Obtener logs de autenticación
createAuthMiddleware(options)
Crea middleware de autenticación JWT.
Opciones:
jwtSecret(string, requerido) - Secreto para JWT
initAuthTables(db)
Inicializa las tablas de autenticación en la base de datos.
Parámetros:
db(Database) - Instancia de better-sqlite3
Frontend
<AuthProvider>
Provider de contexto de autenticación.
Props:
children(ReactNode, requerido)loadUserPreferences(Function, opcional) - Función para cargar preferenciasupdateUserPreferences(Function, opcional) - Función para actualizar preferencias
<Login>
Componente de página de login.
Props:
appName(string, opcional) - Nombre de la app (default: 'App')appSubtitle(string, opcional) - Subtítulo (default: 'Inicia sesión para continuar')logo(ReactNode, opcional) - Logo personalizadoredirectPath(string, opcional) - Ruta de redirección (default: '/')styles(Object, opcional) - Estilos personalizadosshowDebugInfo(boolean, opcional) - Mostrar info de debug (default: false)
<ProtectedRoute>
Componente para proteger rutas.
Props:
children(ReactNode, requerido)loginPath(string, opcional) - Ruta de login (default: '/login')loadingComponent(ReactNode, opcional) - Componente de carga personalizadoprimaryColor(string, opcional) - Color primario (default: 'indigo')
useAuth()
Hook para acceder al contexto de autenticación.
Retorna:
user- Datos del usuario actualloading- Estado de cargaisAuthenticated- Si está autenticadologin(email, password)- Función de loginloginWithToken(token)- Login con tokenlogout()- Cerrar sesióngetToken()- Obtener token actual
Extensibilidad
Añadir Campos a la Tabla Users
El paquete crea la tabla users con campos mínimos. Para añadir campos adicionales, crea una migración:
// Después de initAuthTables(db)
db.exec('ALTER TABLE users ADD COLUMN tu_campo TEXT');
Personalizar UI del Login
El componente Login acepta props para personalización:
<Login
appName="Mi Aplicación"
logo={<img src="/logo.png" alt="Logo" />}
styles={{ primaryColor: 'blue' }}
/>
Personalizar Carga de Preferencias
Puedes proporcionar funciones personalizadas al AuthProvider:
<AuthProvider
loadUserPreferences={async (userData, setUser) => {
const prefs = await fetch('/api/users/me').then(r => r.json());
setUser({ ...userData, ...prefs });
}}
>
Ejemplos
Ver examples/integration.md para ejemplos completos de integración.
Licencia
MIT
Dependencies
Dependencies
| ID | Version |
|---|---|
| bcrypt | ^5.1.1 |
| express | ^4.18.2 |
| jsonwebtoken | ^9.0.2 |
Peer dependencies
| ID | Version |
|---|---|
| react | ^18.0.0 |
| react-router-dom | ^6.0.0 |