Licencias de Software
Auris Licensing te permite proteger tu software con claves de licencia — valida online, respaldo offline, controla funcionalidades, limita puestos y dispositivos, y automatiza la emisión de claves desde Stripe o PayPal.
Esta guía te lleva a través del flujo completo: crear una política, emitir una clave y validarla en tu app.
Cómo Funciona
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Auris Console │ │ Auris API │ │ Your App │
│ (Admin UI) │ │ (Backend) │ │ (Desktop/Web) │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ Create Policy │────▶│ Store policy │ │ │
│ Issue Key │────▶│ Generate key │ │ │
│ │ │ + JWT token │ │ │
│ │ │ │◀────│ validateLicense()│
│ │ │ Check validity │────▶│ ✓ or ✗ │
│ │ │ │◀────│ activateLicense()│
│ │ │ Register device │────▶│ Device saved │
└─────────────────┘ └─────────────────┘ └─────────────────┘Tres modos de validación:
| Modo | Cómo funciona | Ideal para |
|---|---|---|
| Online | Cada verificación consulta la API | SaaS, apps web, siempre conectado |
| Hybrid | Online primero, respaldo JWT si está offline | Apps de escritorio, conectividad intermitente |
| Offline | Solo JWT, sin red necesaria | Entornos aislados, embebidos, dispositivos de campo |
Inicio Rápido
Crear una Política
En la Consola de Auris, ve a Licensing → Policies → New Policy.
Configura:
- Name:
Vigilante Pro - Slug:
vigilante-pro - Validation Mode:
Hybrid - Dimensions: Habilita puestos (máx. 3), dispositivos (máx. 2), expiración (365 días)
- Features:
threat-intel,vuln-scan,api-access - Key Format: Prefijo
VIG, 4 segmentos x 4 caracteres, Base32
Emitir una Clave
Ve a Licensing → Keys → Issue Key, selecciona tu política e ingresa la información del licenciatario. Obtendrás una clave como:
VIG-A8BC-D3EF-G4HJ-K5LMInstalar el SDK
npm
npm install @auris/jsValidar en Tu App
import { validateLicense } from '@auris/js'
const result = await validateLicense('VIG-A8BC-D3EF-G4HJ-K5LM', 'auth.yourdomain.com')
if (result.valid) {
console.log('License is valid!')
console.log('Features:', result.features) // ['threat-intel', 'vuln-scan', 'api-access']
console.log('Seats:', result.seats) // { used: 1, max: 3 }
console.log('Expires:', result.expiresAt) // '2027-03-15T00:00:00Z'
} else {
console.log('Invalid:', result.reason) // 'EXPIRED', 'REVOKED', etc.
}Eso es todo. Una sola llamada a función.
Integración con Apps de Escritorio
Para apps de escritorio (Electron, Tauri, etc.), normalmente querrás activación de dispositivo y respaldo offline.
Ejemplo Completo
import {
validateLicense,
validateLicenseJwt,
activateLicense,
deactivateLicense,
} from '@auris/js'
const DOMAIN = 'auth.yourdomain.com'
// ── Step 1: Activation (first launch) ────────────────────────
// The user enters their license key. You register the device.
async function activate(key: string) {
const fingerprint = getDeviceFingerprint() // e.g. machine UUID
await activateLicense(key, DOMAIN, fingerprint, os.hostname())
// Save key locally for future launches
store.set('licenseKey', key)
}
// ── Step 2: Validation (every launch) ────────────────────────
// Check the license. Online if possible, offline fallback.
async function checkLicense(): Promise<boolean> {
const key = store.get('licenseKey')
if (!key) return false
const result = await validateLicense(key, DOMAIN)
// Online validation succeeded
if (result.valid) {
// Cache the JWT for offline use
if (result.jwtToken) store.set('licenseJwt', result.jwtToken)
return true
}
// Network error — try offline
if (result.reason === 'NETWORK_ERROR') {
const jwt = store.get('licenseJwt')
if (jwt) {
const offline = await validateLicenseJwt(jwt, DOMAIN)
return offline.valid
}
}
return false
}
// ── Step 3: Feature gating ───────────────────────────────────
async function hasFeature(feature: string): Promise<boolean> {
const result = await validateLicense(store.get('licenseKey')!, DOMAIN)
return result.valid && (result.features?.includes(feature) ?? false)
}
// ── Step 4: Deactivation (uninstall / sign out) ──────────────
async function deactivate() {
const key = store.get('licenseKey')
if (key) {
await deactivateLicense(key, DOMAIN, getDeviceFingerprint())
store.delete('licenseKey')
store.delete('licenseJwt')
}
}El respaldo offline funciona porque cada clave de licencia tiene un token JWT asociado que contiene los derechos (funcionalidades, puestos, expiración) firmados por Auris. El SDK valida la firma del JWT y verifica la lista de revocación localmente. El período de gracia (configurable por política, por defecto 7 días) determina cuánto tiempo permanece válida la validación offline.
Integración con Apps Web
Para apps web que están siempre online, solo necesitas validateLicense:
import { validateLicense } from '@auris/js'
// Middleware or API route
export async function checkLicense(licenseKey: string) {
const result = await validateLicense(licenseKey, 'auth.yourdomain.com')
if (!result.valid) throw new Error(`License invalid: ${result.reason}`)
return result
}Integración con React
Usa @auris/react para verificación de licencias basada en hooks:
import { useAuris } from '@auris/react'
import { validateLicense } from '@auris/js'
import { useQuery } from '@tanstack/react-query'
function useLicense(key: string) {
const { domain } = useAuris()
return useQuery({
queryKey: ['license', key],
queryFn: () => validateLicense(key, domain),
staleTime: 5 * 60 * 1000, // cache for 5 minutes
})
}
function ProFeature({ children }: { children: React.ReactNode }) {
const { data } = useLicense(userLicenseKey)
if (!data?.valid) return <UpgradePrompt />
if (!data.features?.includes('pro-feature')) return <UpgradePrompt />
return <>{children}</>
}Automatizar la Emisión de Claves
En lugar de emitir claves manualmente, conecta Stripe o PayPal para emitir claves automáticamente al recibir un pago.
Crear una Regla de Automatización
En la Consola, ve a Licensing → Automation → New Rule:
- Provider: Stripe
- Trigger:
checkout.session.completed - Action:
issue_key - Linked Policy: Vigilante Pro
Configurar el Webhook
En el Dashboard de Stripe, agrega un endpoint de webhook:
https://auth.yourdomain.com/api/licensing/webhooks/stripeEventos a escuchar: checkout.session.completed
Configura STRIPE_LICENSING_WEBHOOK_SECRET en tu entorno de Auris API.
Listo
Cuando un cliente completa el checkout, Auris emite automáticamente una clave bajo la política vinculada. La clave está disponible a través de la API y puede enviarse al cliente por correo electrónico o mostrarse en tu app.
Patrones de Control de Funcionalidades
Flags de Funcionalidades Booleanas
const result = await validateLicense(key, domain)
const canExport = result.features?.includes('export') ?? false
const canUseApi = result.features?.includes('api-access') ?? falseAcceso por Niveles
// Define tiers as policies with different feature sets
// Free: ['basic']
// Pro: ['basic', 'analytics', 'export']
// Enterprise: ['basic', 'analytics', 'export', 'api-access', 'sso']
function getTier(features: string[]): 'free' | 'pro' | 'enterprise' {
if (features.includes('sso')) return 'enterprise'
if (features.includes('analytics')) return 'pro'
return 'free'
}Aplicación de Límite de Puestos
const result = await validateLicense(key, domain)
if (result.seats && result.seats.used >= (result.seats.max ?? Infinity)) {
throw new Error('Seat limit reached. Please upgrade your plan.')
}Seguimiento de Uso
Rastrea el uso medido (llamadas API, almacenamiento, etc.) contra una clave:
import { recordLicenseUsage, getLicenseUsage } from '@auris/js'
// Record usage
await recordLicenseUsage(key, domain, 'api_calls', 1)
// Check usage
const usage = await getLicenseUsage(key, domain)
// { api_calls: { used: 142, max: 1000, period: 'month', resetsAt: '2026-04-01' } }Referencia del SDK
Todas las funciones de licencias se exportan desde @auris/js:
| Función | Descripción |
|---|---|
validateLicense(key, domain) | Validación online — devuelve validez, funcionalidades, puestos, dispositivos, expiración |
validateLicenseJwt(jwt, domain) | Validación offline — verifica expiración del JWT + lista de revocación |
activateLicense(key, domain, fingerprint, name?) | Registrar un dispositivo |
deactivateLicense(key, domain, fingerprint) | Eliminar un dispositivo |
recordLicenseUsage(key, domain, metric, amount?) | Rastrear uso medido |
getLicenseUsage(key, domain) | Obtener uso actual de una clave |
refreshRevocationList(domain) | Actualizar manualmente la caché de revocación offline |
Consulta la referencia completa del SDK de JavaScript y la referencia de la API de Licencias para más detalles.