Software-Lizenzierung
Auris Licensing schützt deine Software mit Lizenzschlüsseln — validiere online, nutze Offline-Fallback, steuere Funktionen, begrenze Plätze und Geräte und automatisiere die Schlüsselausstellung über Stripe oder PayPal.
Dieser Leitfaden führt dich durch den gesamten Ablauf: Richtlinie erstellen, Schlüssel ausstellen und in deiner App validieren.
So funktioniert es
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 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 │
└─────────────────┘ └─────────────────┘ └─────────────────┘Drei Validierungsmodi:
| Modus | Funktionsweise | Geeignet für |
|---|---|---|
| Online | Jede Prüfung ruft die API auf | SaaS, Web-Apps, immer verbunden |
| Hybrid | Online zuerst, JWT-Fallback bei Offline | Desktop-Apps, intermittierende Verbindung |
| Offline | Nur JWT, kein Netzwerk erforderlich | Air-Gapped, eingebettete Systeme, Feldgeräte |
Schnellstart
Richtlinie erstellen
Gehe in der Auris-Konsole zu Licensing → Policies → New Policy.
Konfiguriere:
- Name:
Vigilante Pro - Slug:
vigilante-pro - Validierungsmodus:
Hybrid - Dimensionen: Plätze aktivieren (max. 3), Geräte (max. 2), Ablauf (365 Tage)
- Funktionen:
threat-intel,vuln-scan,api-access - Schlüsselformat: Präfix
VIG, 4 Segmente x 4 Zeichen, Base32
Schlüssel ausstellen
Gehe zu Licensing → Keys → Issue Key, wähle deine Richtlinie und gib die Lizenznehmer-Informationen ein. Du erhältst einen Schlüssel wie:
VIG-A8BC-D3EF-G4HJ-K5LMSDK installieren
npm
npm install @auris/jsIn deiner App validieren
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.
}Das war’s. Ein Funktionsaufruf.
Desktop-App-Integration
Für Desktop-Apps (Electron, Tauri usw.) benötigst du typischerweise Geräteaktivierung und Offline-Fallback.
Vollständiges Beispiel
import {
validateLicense,
validateLicenseJwt,
activateLicense,
deactivateLicense,
} from '@auris/js'
const DOMAIN = 'auth.yourdomain.com'
// ── Schritt 1: Aktivierung (erster Start) ────────────────────────
// Der Benutzer gibt seinen Lizenzschlüssel ein. Du registrierst das Gerät.
async function activate(key: string) {
const fingerprint = getDeviceFingerprint() // e.g. machine UUID
await activateLicense(key, DOMAIN, fingerprint, os.hostname())
// Schlüssel lokal für zukünftige Starts speichern
store.set('licenseKey', key)
}
// ── Schritt 2: Validierung (bei jedem Start) ────────────────────────
// Lizenz prüfen. Online wenn möglich, Offline-Fallback.
async function checkLicense(): Promise<boolean> {
const key = store.get('licenseKey')
if (!key) return false
const result = await validateLicense(key, DOMAIN)
// Online-Validierung erfolgreich
if (result.valid) {
// JWT für Offline-Nutzung zwischenspeichern
if (result.jwtToken) store.set('licenseJwt', result.jwtToken)
return true
}
// Netzwerkfehler — Offline versuchen
if (result.reason === 'NETWORK_ERROR') {
const jwt = store.get('licenseJwt')
if (jwt) {
const offline = await validateLicenseJwt(jwt, DOMAIN)
return offline.valid
}
}
return false
}
// ── Schritt 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)
}
// ── Schritt 4: Deaktivierung (Deinstallation / Abmeldung) ──────────────
async function deactivate() {
const key = store.get('licenseKey')
if (key) {
await deactivateLicense(key, DOMAIN, getDeviceFingerprint())
store.delete('licenseKey')
store.delete('licenseJwt')
}
}Offline-Fallback funktioniert, weil jeder Lizenzschlüssel ein zugehöriges JWT-Token besitzt, das die Berechtigungen (Funktionen, Plätze, Ablauf) enthält und von Auris signiert ist. Das SDK validiert die JWT-Signatur und prüft die Widerrufsliste lokal. Die Karenzzeit (pro Richtlinie konfigurierbar, Standard 7 Tage) bestimmt, wie lange die Offline-Validierung gültig bleibt.
Web-App-Integration
Für Web-Apps, die immer online sind, benötigst du nur validateLicense:
import { validateLicense } from '@auris/js'
// Middleware oder 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
}React-Integration
Verwende @auris/react für Hook-basierte Lizenzprüfung:
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, // 5 Minuten zwischenspeichern
})
}
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}</>
}Schlüsselausstellung automatisieren
Anstatt Schlüssel manuell auszustellen, verbinde Stripe oder PayPal, um Schlüssel bei Zahlung automatisch auszustellen.
Automatisierungsregel erstellen
Gehe in der Konsole zu Licensing → Automation → New Rule:
- Anbieter: Stripe
- Auslöser:
checkout.session.completed - Aktion:
issue_key - Verknüpfte Richtlinie: Vigilante Pro
Webhook konfigurieren
Füge im Stripe-Dashboard einen Webhook-Endpunkt hinzu:
https://auth.yourdomain.com/api/licensing/webhooks/stripeZu überwachende Ereignisse: checkout.session.completed
Setze STRIPE_LICENSING_WEBHOOK_SECRET in deiner Auris-API-Umgebung.
Fertig
Wenn ein Kunde den Checkout abschließt, stellt Auris automatisch einen Schlüssel unter der verknüpften Richtlinie aus. Der Schlüssel ist über die API verfügbar und kann dem Kunden per E-Mail gesendet oder in deiner App angezeigt werden.
Feature-Gating-Muster
Boolesche Feature-Flags
const result = await validateLicense(key, domain)
const canExport = result.features?.includes('export') ?? false
const canUseApi = result.features?.includes('api-access') ?? falseStufenbasierter Zugriff
// Stufen als Richtlinien mit verschiedenen Feature-Sets definieren
// 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'
}Platz-Durchsetzung
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.')
}Nutzungsverfolgung
Verbrauchsbasierte Nutzung (API-Aufrufe, Speicher usw.) gegen einen Schlüssel verfolgen:
import { recordLicenseUsage, getLicenseUsage } from '@auris/js'
// Nutzung erfassen
await recordLicenseUsage(key, domain, 'api_calls', 1)
// Nutzung prüfen
const usage = await getLicenseUsage(key, domain)
// { api_calls: { used: 142, max: 1000, period: 'month', resetsAt: '2026-04-01' } }SDK-Referenz
Alle Lizenzierungsfunktionen werden aus @auris/js exportiert:
| Funktion | Beschreibung |
|---|---|
validateLicense(key, domain) | Online-Validierung — gibt Gültigkeit, Funktionen, Plätze, Geräte, Ablauf zurück |
validateLicenseJwt(jwt, domain) | Offline-Validierung — prüft JWT-Ablauf + Widerrufsliste |
activateLicense(key, domain, fingerprint, name?) | Ein Gerät registrieren |
deactivateLicense(key, domain, fingerprint) | Ein Gerät entfernen |
recordLicenseUsage(key, domain, metric, amount?) | Verbrauchsbasierte Nutzung erfassen |
getLicenseUsage(key, domain) | Aktuelle Nutzung für einen Schlüssel abrufen |
refreshRevocationList(domain) | Offline-Widerrufscache manuell aktualisieren |
Die vollständige JavaScript SDK-Referenz und Lizenzierungs-API-Referenz findest du dort.