Licences Logicielles
Auris Licensing te permet de protéger ton logiciel avec des clés de licence — valide en ligne, bascule en mode hors connexion, contrôle l’accès aux fonctionnalités, limite les sièges et les appareils, et automatise l’émission de clés depuis Stripe ou PayPal.
Ce guide t’accompagne à travers le flux complet : créer une politique, émettre une clé et la valider dans ton application.
Comment ça fonctionne
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 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 │
└─────────────────┘ └─────────────────┘ └─────────────────┘Trois modes de validation :
| Mode | Fonctionnement | Idéal pour |
|---|---|---|
| Online | Chaque vérification interroge l’API | SaaS, applications web, toujours connecté |
| Hybrid | En ligne d’abord, fallback JWT si hors connexion | Applications de bureau, connectivité intermittente |
| Offline | JWT uniquement, pas de réseau nécessaire | Environnements isolés, embarqué, appareils de terrain |
Démarrage rapide
Créer une politique
Dans la Console Auris, va dans Licensing → Policies → New Policy.
Configure :
- Name :
Vigilante Pro - Slug :
vigilante-pro - Validation Mode :
Hybrid - Dimensions : Active les sièges (max 3), appareils (max 2), expiration (365 jours)
- Features :
threat-intel,vuln-scan,api-access - Key Format : Préfixe
VIG, 4 segments x 4 caractères, Base32
Émettre une clé
Va dans Licensing → Keys → Issue Key, sélectionne ta politique et entre les informations du titulaire. Tu obtiendras une clé comme :
VIG-A8BC-D3EF-G4HJ-K5LMInstaller le SDK
npm
npm install @auris/jsValider dans ton application
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.
}C’est tout. Un seul appel de fonction.
Intégration application de bureau
Pour les applications de bureau (Electron, Tauri, etc.), tu voudras généralement l’activation d’appareils et le fallback hors connexion.
Exemple complet
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')
}
}Le fallback hors connexion fonctionne car chaque clé de licence possède un token JWT associé contenant les droits (fonctionnalités, sièges, expiration) signés par Auris. Le SDK valide la signature JWT et vérifie la liste de révocation localement. La période de grâce (configurable par politique, 7 jours par défaut) détermine la durée de validité de la validation hors connexion.
Intégration application web
Pour les applications web toujours connectées, tu n’as besoin que de 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
}Intégration React
Utilise @auris/react pour la vérification de licence via des 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}</>
}Automatiser l’émission de clés
Au lieu d’émettre des clés manuellement, connecte Stripe ou PayPal pour émettre automatiquement des clés lors du paiement.
Créer une règle d’automatisation
Dans la Console, va dans Licensing → Automation → New Rule :
- Provider : Stripe
- Trigger :
checkout.session.completed - Action :
issue_key - Linked Policy : Vigilante Pro
Configurer le webhook
Dans le tableau de bord Stripe, ajoute un endpoint de webhook :
https://auth.yourdomain.com/api/licensing/webhooks/stripeÉvénements à écouter : checkout.session.completed
Configure STRIPE_LICENSING_WEBHOOK_SECRET dans l’environnement de ton API Auris.
Terminé
Lorsqu’un client complète le checkout, Auris émet automatiquement une clé sous la politique liée. La clé est disponible via l’API et peut être envoyée au client par e-mail ou affichée dans ton application.
Patterns de contrôle d’accès aux fonctionnalités
Drapeaux de fonctionnalités booléens
const result = await validateLicense(key, domain)
const canExport = result.features?.includes('export') ?? false
const canUseApi = result.features?.includes('api-access') ?? falseAccès par niveaux
// 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'
}Application de la limite de sièges
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.')
}Suivi d’utilisation
Suis l’utilisation à la consommation (appels API, stockage, etc.) pour une clé :
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' } }Référence SDK
Toutes les fonctions de licence sont exportées depuis @auris/js :
| Fonction | Description |
|---|---|
validateLicense(key, domain) | Validation en ligne — retourne la validité, les fonctionnalités, les sièges, les appareils, l’expiration |
validateLicenseJwt(jwt, domain) | Validation hors connexion — vérifie l’expiration du JWT et la liste de révocation |
activateLicense(key, domain, fingerprint, name?) | Enregistrer un appareil |
deactivateLicense(key, domain, fingerprint) | Retirer un appareil |
recordLicenseUsage(key, domain, metric, amount?) | Suivre l’utilisation à la consommation |
getLicenseUsage(key, domain) | Obtenir l’utilisation actuelle d’une clé |
refreshRevocationList(domain) | Rafraîchir manuellement le cache de révocation hors connexion |
Consulte la référence complète du SDK JavaScript et la référence de l’API de Licences pour plus de détails.