UNPKG

sdk-simple-auth

Version:

Universal JavaScript/TypeScript authentication SDK with multi-backend support, automatic token refresh, and React integration

289 lines (246 loc) 7.69 kB
// =================================== // EJEMPLO: Configuraciones para diferentes backends // =================================== import { AuthSDK, createQuickNodeAuth, createQuickSanctumAuth, AuthSDKFactory } from 'sdk-simple-auth'; // =================================== // 1. BACKEND NODE.JS/EXPRESS ESTÁNDAR // =================================== // Respuesta típica de Node.js/Express: // { // "success": true, // "data": { // "user": { "id": 1, "email": "user@test.com", "name": "Usuario" }, // "token": "eyJhbGciOiJIUzI1NiIs...", // "refreshToken": "refresh-token-here" // } // } const nodeAuth = createQuickNodeAuth('http://localhost:3000'); // O configuración manual: const nodeAuthManual = new AuthSDK({ authServiceUrl: 'http://localhost:3000', backend: { type: 'node-express', userSearchPaths: ['data.user', 'user'], fieldMappings: { userId: ['id', 'user_id'], email: ['email'], name: ['name', 'full_name'], token: ['token', 'access_token'], refreshToken: ['refreshToken', 'refresh_token'] } } }); // =================================== // 2. LARAVEL SANCTUM // =================================== // Respuesta típica de Laravel Sanctum: // { // "user": { // "id": 1, // "email": "user@test.com", // "created_at": "2025-01-01T00:00:00.000000Z", // "sucursales": [...] // }, // "token": "1|sanctum-token-here" // } const sanctumAuth = createQuickSanctumAuth('http://localhost:8000/api'); // Login con device_name (requerido por Sanctum) async function loginSanctum() { try { const user = await sanctumAuth.login({ email: 'usuario@ejemplo.com', password: 'password', device_name: 'mi-app-web' // Requerido por Sanctum }); console.log('Usuario Sanctum:', user); // Todos los campos originales se preservan: sucursales, created_at, etc. } catch (error) { console.error('Error Sanctum:', error); } } // =================================== // 3. JWT ESTÁNDAR // =================================== // Respuesta típica JWT: // { // "access_token": "eyJhbGciOiJIUzI1NiIs...", // "refresh_token": "refresh-token-here", // "user": { "sub": "1", "email": "user@test.com" } // } const jwtAuth = new AuthSDK({ authServiceUrl: 'http://localhost:3000', backend: { type: 'jwt-standard', userSearchPaths: ['user', 'data'], fieldMappings: { userId: ['sub', 'id'], email: ['email'], name: ['name', 'username'], token: ['access_token', 'token'], refreshToken: ['refresh_token'] } } }); // =================================== // 4. BACKEND PERSONALIZADO // =================================== // Si tu backend tiene una estructura única: // { // "status": "ok", // "profile": { // "userId": 123, // "mail": "user@test.com", // "fullName": "Usuario Test" // }, // "credentials": { // "accessToken": "token-here", // "renewToken": "refresh-here" // } // } const customAuth = new AuthSDK({ authServiceUrl: 'http://localhost:3000', backend: { type: 'custom', userSearchPaths: ['profile', 'data.profile'], fieldMappings: { userId: ['userId', 'id'], email: ['mail', 'email'], name: ['fullName', 'name'], token: ['credentials.accessToken', 'accessToken'], refreshToken: ['credentials.renewToken', 'renewToken'] }, preserveOriginalData: true // Mantener estructura original } }); // =================================== // 5. AUTO-DETECCIÓN DE BACKEND // =================================== async function autoDetectBackend() { // Paso 1: Hacer login manual para obtener respuesta const response = await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'test@test.com', password: '123' }) }); const data = await response.json(); // Paso 2: Analizar y crear SDK automáticamente const auth = quickAnalyzeAndCreate(data, 'http://localhost:3000'); console.log('SDK configurado automáticamente'); return auth; } // =================================== // 6. CONFIGURACIÓN CON AXIOS // =================================== import axios from 'axios'; const axiosAuth = new AuthSDK({ authServiceUrl: 'http://localhost:3000', httpClient: { async post(url, data, config) { const response = await axios.post(url, data, config); return response.data; }, async get(url, config) { const response = await axios.get(url, config); return response.data; }, async put(url, data, config) { const response = await axios.put(url, data, config); return response.data; }, async delete(url, config) { const response = await axios.delete(url, config); return response.data; } } }); // =================================== // 7. CONFIGURACIÓN COMPLETA AVANZADA // =================================== const advancedAuth = new AuthSDK({ authServiceUrl: 'http://localhost:3000', // Endpoints personalizados endpoints: { login: '/auth/signin', register: '/auth/signup', refresh: '/auth/refresh-token', logout: '/auth/signout', profile: '/auth/me' }, // Storage personalizado storage: { type: 'indexedDB', // 'localStorage' | 'indexedDB' dbName: 'MyAppAuth', dbVersion: 1, storeName: 'auth_store', tokenKey: 'my_access_token', refreshTokenKey: 'my_refresh_token', userKey: 'my_user_data' }, // Refresh automático tokenRefresh: { enabled: true, bufferTime: 300, // 5 minutos antes de expirar maxRetries: 3, minimumTokenLifetime: 300, // 5 minutos mínimo gracePeriod: 60 // 1 minuto de gracia }, // Backend específico backend: { type: 'custom', userSearchPaths: ['user', 'data.user', 'profile'], fieldMappings: { userId: ['id', 'user_id', 'userId'], email: ['email', 'mail', 'email_address'], name: ['name', 'username', 'full_name', 'display_name'], firstName: ['first_name', 'firstName', 'given_name'], lastName: ['last_name', 'lastName', 'family_name'], role: ['role', 'roles', 'user_role'], permissions: ['permissions', 'abilities', 'scopes'], token: ['token', 'access_token', 'accessToken'], refreshToken: ['refresh_token', 'refreshToken', 'renewalToken'] }, preserveOriginalData: true } }); // =================================== // 8. TESTING DE CONFIGURACIONES // =================================== async function testConfiguration(auth, testData) { console.log('🧪 Testing configuración...'); // Test de extracción auth.testExtraction(testData); try { // Test de login const user = await auth.login({ email: 'test@example.com', password: 'password123' }); console.log('✅ Login exitoso:', user); // Test de token const token = await auth.getValidAccessToken(); console.log('✅ Token obtenido:', token ? 'OK' : 'FAIL'); // Test de headers const headers = await auth.getAuthHeaders(); console.log('✅ Headers:', headers); // Test de sesión const sessionInfo = await auth.getExtendedSessionInfo(); console.log('✅ Sesión:', sessionInfo); } catch (error) { console.error('❌ Error en test:', error); } } // Ejemplo de uso: // testConfiguration(nodeAuth, sampleNodeResponse); // =================================== // EXPORTAR CONFIGURACIONES // =================================== export { nodeAuth, sanctumAuth, jwtAuth, customAuth, advancedAuth, loginSanctum, autoDetectBackend, testConfiguration };