Ajoutez des licences à votre logiciel
Prévoyez environ 15 minutes pour protéger un export : configuration, exemple, intégration et test de refus. Les outils du langage doivent être déjà installés.
Le SDK gère requêtes, appareil, signatures, identifiants, cache et signaux. Fournissez la clé saisie et votre fonction métier ; ni HTTP manuel ni stockage d’activation_id requis.
- Télécharger le paquet d’intégrationGénérez les paramètres du produit dans la console
- Générer un fichier exportéVérifier l’autorisation et le résultat métier
- Intégrez à votre applicationDémarrage, entrée métier, arrêt
1. Préparez le paquet dans la console
Ouvrez Démarrage rapide, saisissez le nom du logiciel, choisissez une licence liée aux appareils ou flottante, puis créez le produit et continuez. Le système prépare le produit, la règle, la licence de test, la clé publique et la version 1.0.0. Choisissez un langage, téléchargez le paquet configuré et extrayez-le.
Le paquet contient deux configurations :sdk-demo.json contient une clé de licence de test pour vos essais ;product.json contient uniquement les paramètres du produit et la clé publique, et peut être distribué avec votre logiciel.
Pour commencer, choisissez une licence liée à l’appareil. L’exemple active export sans compteur. Pour un produit existant, autorisez la fonction dans la stratégie et la licence.
2. Vérifier l’environnement et exporter un fichier
Ouvrez un terminal à la racine extraite. Gardez product.json, sdk-demo.json, start.ps1, start.sh et sdk ensemble. Choisissez langage et système, puis exécutez. Le contrôle n’envoie pas d’activation.
Résultat attendu :Code 0, sortie ci-dessous et nouveau licensed-report.txt. Relancez sans option de test : le SDK restaure l’identifiant de l’appareil sans occuper une autre place.
License OK: export is available
Export completed: licensed-report.txtInstallez les outils manquants. C/C++ nécessite aussi les fichiers de développement libcurl ; MinGW accepte -CurlRoot. Accepter un avertissement du navigateur ne suffit pas : l’environnement doit faire confiance au certificat du serveur de test.
3. Intégrez-le à l’application du client
Lancez l’installateur dans votre projet. Les neuf langages utilisent 0.10.0. SHA-256 est vérifié avant installation ou extraction. Ajoutez uniquement product.json aux ressources.
Installer hors ligne depuis le paquet d’intégration téléchargé
Remplacez SDK_ROOT par le chemin absolu du dossier extrait.
Fichier exécutable pour ce langage :. Copiez son point d’entrée métier dans votre projet ; Voir le code complet →
| Étape de l’application | Action à effectuer |
|---|---|
| Démarrage ou écran d’activation | Fournissez product.json et la clé du client. Après activation, passez une clé vide aux démarrages suivants. Une application graphique active en arrière-plan. |
| Bouton, raccourci, menu ou commande d’exportation | Passez votre fonction d’export à RunFeature. Le SDK vérifie l’autorisation avant de l’appeler. Gardez le même client actif. |
| Arrêt de l’application | Fermez client pour arrêter les signaux. Les sièges flottants sont rendus ; l’appareil lié reste enregistré. |
4. Vérifier qu’un refus bloque l’exportation
Vérifiez que la stratégie exclut licentivo_denied_probe, puis lancez la commande. Attendez un code non nul et aucun denied-report.txt. Utilisez un fichier de sortie inexistant.
5. Ajouter des opérations comptées si nécessaire
Passez votre fonction et un ID stable à RunMeteredFeature. Le SDK réserve l’usage, confirme la réussite, annule l’échec métier et conserve les confirmations en attente.Voir l’intégration comptée et les reprises →
Distribuez seulement le SDK requis et product.json. Chaque client a sa clé. Excluez sdk-demo.json, caches, identifiants d’appareil et clés de gestion API. Un cache_path vide choisit un répertoire privé par utilisateur.
Distinguez ces trois identifiants
| Nom | Utilisé par | Usage |
|---|---|---|
Clé de licence lv_lic_… | L’acheteur du logiciel | Activez dans l’application. Le code temporaire de transfert lv_tmp_… se saisit aussi dans ce champ. |
| Identifiant produit | SDK / Développeur du logiciel | Identifie le produit à valider ; peut être distribué avec l’application. |
| Clé API de gestion | Le serveur du fournisseur | Automatise l’émission, le renouvellement et la gestion des licences. L’activation du client n’en a pas besoin. |
Réglez séparément l’intervalle de heartbeat et la durée hors ligne dans Politiques de licence. La validité commence à la première activation. Ajoutez ensuite quotas de fonctions, postes flottants et activation par fichier hors ligne.
Sans inscription, vous pouvez ouvrir Essayer la démopour consulter requêtes et réponses. Pour automatiser l’émission, poursuivez avec Clé API de gestion.
SDK client
Confiez votre fonction au SDK : RunFeature pour l’accès, RunMeteredFeature pour les compteurs. Le SDK gère requêtes, signatures, cache et signaux périodiques.
Avant l’exécution
Dans la console, Démarrage rapidetéléchargez le paquet configuré. La démo utilise le fichier privé sdk-demo.json ; dans l’application réelle, utilisez product.json, avec la clé du client fournie au démarrage. Télécharger le SDK fournit les sources génériques sans vos paramètres produit.
Que signifie chaque champ de configuration ?
{
"base_url": "https://www.licentivo.com",
"product_id": "PRODUCT_UUID",
"license_key": "",
"device_name": "Customer app",
"app_version": "1.0.0",
"trusted_keys": {
"SIGNING_KEY_UUID": "BASE64URL_PUBLIC_KEY"
},
"timeout_seconds": 10,
"allow_http": false
}base_url- URL du serveur de licences : domaine et port uniquement, sans
/api/v1. Pour les tests locaux, utilisezhttps://127.0.0.1:8080. product_id- Identifiant du produit de cette application. Il doit correspondre au produit de la licence.
license_key- Laissez ce champ vide dans product.json. Fournissez la clé du client à OpenWithLicense :
lv_lic_…ou un code de transfert :lv_tmp_…; cela ne modifie pas la configuration partagée. app_version- Version actuelle au format majeur.mineur.correctif, par exemple 1.0.0. Obligatoire si la plage de versions ou la maintenance est activée. Revalidez en ligne après un changement de version.
device_name- Nom de l’appareil affiché dans la console. Il facilite l’identification visuelle, mais ne définit pas l’identité de l’appareil.
trusted_keys- Identifiant de clé de signature et clé publique du produit. Distribuez-les avec l’application ou une mise à jour authentifiée. Ne faites jamais confiance à une clé issue d’une réponse inconnue.
cache_path- Omettez-le ou laissez-le vide pour utiliser automatiquement un répertoire privé par utilisateur, ou indiquez un fichier privé de votre application.
timeout_seconds- Délai d’une requête en secondes : 10 par défaut, de 1 à 120. Une panne réseau temporaire permet deux tentatives au maximum.
proxy_url- URL de proxy facultative. Java utilise un proxy HTTP ; Node.js nécessite undici si un proxy est configuré. La vérification des certificats reste active.
allow_http- En production, gardez la valeur
false, avec HTTPS. Pour les tests locaux, réglez surtrue, uniquement pour localhost ou les adresses de bouclage.
Vous n’avez pas à saisir device_id : le SDK lit l’identité locale. Les clés publiques de product.json peuvent être distribuées ; gardez les clés client et sdk-demo.json privés.
Choisissez votre langage
Ce code correspond au fichier livré et crée un export réel. Les variables remplacent la saisie d’activation ; utilisez votre interface et gardez client actif pendant l’application.
Installation commune et versions publiées
Choisissez langage et plateforme, puis lancez dans votre projet. Le SDK est distribué sur le site Licentivo sans compte GitHub. La publication GitHub et registres reste en attente.
Version : · Paquet versionné · Fichier de sommes SHA-256 · Manifeste de version
Windows x64 et Linux x64 sont vérifiés. Les tests physiques macOS et ARM64 restent à faire. Les binaires C/C++ dépendent de la plateforme et du compilateur.
Référencer le SDK installé
| Langue | Intégration au projet |
|---|---|
| Go | import licentivo "github.com/spf86/licentivo-sdk" |
| Java | implementation(files('.licentivo-sdk/java/v0.10.0/licentivo-sdk-0.10.0.jar')) |
| C / C++ | find_package(Licentivo 0.10 REQUIRED) · target_link_libraries(MyApp PRIVATE Licentivo::C) / Licentivo::CPP |
| C# | using Licentivo; |
| Python | from licentivo import Client |
| Node.js | import {Client} from '@licentivo/sdk' |
| Rust | use licentivo::Client; |
| Ruby | require 'licentivo' |
Conservez le dossier .licentivo-sdk de Go, Rust et C/C++. Choisissez une nouvelle version pour mettre à jour ; product.json et les caches clients restent intacts.
Exécutez le travail protégé via le SDK et fermez client à l’arrêt.
正在加载代码…Exécuter ce fichier avec le script de démarrage →
Utiliser une autre clé client ou lancer la démo complète
Définissez la variable et lancez le script sans option de test. Une clé de licence n’est pas une clé API de gestion.
En cas de succès, la sortie est License OK: export is available. Dans votre application, recueillez la clé dans le formulaire d’activation. Aucune variable d’environnement n’est nécessaire pour le client ; le SDK conserve l’identifiant de la machine. Ne journalisez pas la clé.
Exécuter la démo complète du paquet
Extrayez le ZIP en conservant l’arborescence. Placez sdk-demo.json à la racine du paquet extrait. Choisissez le système, ouvrez un terminal ici et exécutez :
Cette démo complète sert au diagnostic avancé. Commencez par start.ps1 ou start.sh ; ces exemples gardent l’enregistrement de l’appareil à l’arrêt normal.
Comment exécuter cet exemple de gestion ?
Définissez d’abord ces variables sur votre serveur LICENTIVO_URL et LICENTIVO_API_KEY, renseignez l’adresse du serveur de licences et la clé de gestion complète. L’exemple lit les produits et affiche le statut HTTP et la réponse.
Renvoie HTTP 200 avec data.items, la requête a réussi. En cas de 401, vérifiez si la clé est complète, expirée ou révoquée. Création et permissions sont expliquées dans Clé API de gestion.
Exécuter un exemple d’application
Les exemples incluent saisie d’activation, état, export et libération d’appareil. Java, Python et C# ont une fenêtre ; les autres utilisent un menu terminal. Saisissez la clé une fois, puis laissez-la vide.
Un export réussi crée licensed-report.txt. Configurez le quota export dans la stratégie avant d’utiliser l’export comptabilisé.
Les démos graphiques et menus montrent les réservations bas niveau. Utilisez RunMeteredFeature ci-dessous : les neuf langages conservent les confirmations en attente. Après un crash pendant le travail, vérifiez votre résultat.
Comment afficher l’état de l’autorisation ?
Status et FeatureStatus lisent l’état local, sans requête ni attente d’une vérification. Les notifications peuvent actualiser l’interface.
| État | Signification |
|---|---|
active | La dernière vérification en ligne a réussi ; l’autorisation locale est valide. |
offline_valid | La signature locale est valide ; aucune confirmation en ligne n’a réussi depuis le démarrage. |
verification_required | Aucune signature utilisable. Activez ou actualisez en ligne. |
| expired / revoked / released | Le serveur a explicitement refusé l’autorisation. Arrêtez les opérations protégées. |
quota_exhausted | Cette demande dépasse le quota ; les autres fonctions autorisées restent disponibles. |
allowed indique la validité locale ; les fonctions comptabilisées demandent toujours des unités. lease_valid_until est l’échéance du cache signé, pas celle de la licence. code, request_id et retryable indiquent erreur, référence de journal et possibilité de reprise.
Consultez sdk/README.md pour les méthodes, rappels et paquets. Le site propose des paquets versionnés et installateurs communs ; les registres publics restent en attente.
Où placer ces appels dans votre application ?
| Étape de l’application | Action à effectuer |
|---|---|
| Au démarrage ou après saisie de la clé | Appelez OpenWithLicense (constructeur et Start en C++). Le SDK active et lance les heartbeats selon la règle. |
| Avant une fonction payante | Passez votre fonction à RunFeature ; utilisez RunMeteredFeature pour les compteurs |
| Pendant l’exécution | Gardez client actif ; le SDK envoie les heartbeats à l’intervalle défini. |
| À la fermeture de l’application | Close / Dispose / Destroy arrête les heartbeats, rend les postes flottants et conserve les appareils enregistrés. |
| Quand l’utilisateur délie l’appareil | Appelez Deactivate, puis fermez client. |
Les noms du tableau désignent les opérations ; utilisez ceux de l’exemple de votre langage. Pour les heartbeats, caches hors ligne et rafraîchissements, voir Heartbeats et accès hors ligne.
Clé API de gestion
Utilisez une clé API de gestion pour émettre des licences depuis votre système de commandes ou lire les données d’autorisation depuis un serveur. Elle représente votre espace fournisseur.
Quelle clé faut-il au client ?
| Identifiant d’authentification | Destinataire | Utilité |
|---|---|---|
lv_api_…Clé API de gestion | Votre serveur | Créer produits, règles et licences ; voir appareils, usage et audit |
lv_lic_…Clé de licence | Logiciel du client | Activer, vérifier, envoyer des heartbeats et libérer |
| Clé publique du produit | Distribuer avec le client | Vérifier la signature de licence du serveur |
Pour vérifier l’autorisation du logiciel client, la clé de licence suffit. Une clé API de gestion agit sur tout l’espace : ne l’intégrez pas au logiciel client ni à une page publique.
Créer une clé
- Connectez-vous comme Owner de l’espace et ouvrez API Key puis cliquez sur Créer une clé API.
- Nommez-la selon son usage, par exemple « Commandes ». Choisissez Lecture seule pour consulter, Lecture/écriture pour créer ou modifier des licences. Validité : 1 à 365 jours.
- Copiez la clé complète après l’enregistrement ; elle n’est affichée qu’une fois. Conservez-la dans une configuration privée du serveur ou une variable d’environnement.
Envoyer la première requête de gestion
Cet exemple lit la liste des produits. Définissez LICENTIVO_URL sur l’URL du serveur de licences, puis définissez LICENTIVO_API_KEY avec la clé complète créée, puis exécutez :
curl "$LICENTIVO_URL/api/v1/products?limit=25" \
-H "Authorization: Bearer $LICENTIVO_API_KEY"Syntaxe Bash/macOS/Linux. Avec Windows PowerShell, utilisez curl.exe ; la variable d’environnement est $env:LICENTIVO_URL et $env:LICENTIVO_API_KEY. Les requêtes complètes en neuf langages sont aussi dans Option Clé API de gestion serveur sur la page SDK.
Le succès renvoie HTTP 200 avec data.items. Requêtes Bearer Key sans cookie de connexion ni jeton CSRF.
Droits et invalidation
Une clé Lecture seule consulte les ressources ; Lecture/écriture crée et modifie aussi produits, stratégies et licences. Comptes, équipes, paramètres système et paiements nécessitent un compte connecté disposant des droits, pas une clé de gestion.
Révoquez dans la console toute clé divulguée ou inutilisée. Pour la remplacer, cliquez sur Rotation : l’ancienne est immédiatement invalidée. Mettez ensuite la configuration du serveur à jour.
Le quota API du forfait compte activation, vérification, heartbeat et libération. Ces requêtes de gestion n’y sont pas comptées.
API des produits et licences
Après une commande, émettez les licences depuis votre serveur : créez le produit et la stratégie, puis une licence par client. Les deux premiers éléments se configurent généralement une seule fois.
Créez d’abord dans la console un Clé API de gestion. Les exemples suivants utilisent Authorization: Bearer 你的管理Key ; gardez cette clé sur le serveur du fournisseur.
Utilisez data.id du produit comme product_id et celui de la stratégie comme policy_id. Après émission, gardez data.id et data.key de la licence. La clé complète n’est renvoyée qu’une fois ; key_prefix ne permet pas l’activation.
Pour une licence limitée avant activation,expires_at et first_activated_at sont null. Durée à partir de la première activation ; le transfert ne la recommence pas.
Gestion ultérieure
| Méthode et chemin (sans /api/v1) | Utilité et corps de requête |
|---|---|
GET /products | Liste les produits. Dans la réponse, data.items est le tableau des enregistrements et data.total leur nombre total. |
GET /licenses/{id} | Consulter licence, première activation et échéance. |
POST /licenses/{id}/renew | Renouveler, p. ex. {"days":30}. Conserve la licence d’origine. |
POST /licenses/{id}/revoke | Révoquer ; corps {}. |
GET /products/{id}/public-keys | Lire les clés publiques sans authentification. Fixez les clés de confiance à la distribution du SDK. |
GET /activations | Voir les liens d’appareils et sessions. |
La pagination utilise limit=25&offset=0, limit vaut au plus 100. Autres paramètres et structures : Fichier OpenAPI ; consultez le sujet à gauche correspondant au modèle.
Comment appeler avec une session de navigateur ?
Les écritures avec cookie exigent X-CSRF-Token. Faites GET /api/v1/auth/csrf, puis placez data.csrf_token dans cet en-tête. Les requêtes Bearer Key n’exigent pas de CSRF.
Appels de licence SDK
Choisissez la langue et l’opération, puis appelez le SDK. Il gère l’activation, l’identité de l’appareil, les signatures, le cache, les battements et les réservations, confirmations et annulations d’usage.
Dans ces exemples, client vient du démarrage, path est le chemin d’exportation et exportReport / export_report est votre fonction métier. Le jobID compté est un identifiant stable conservé par l’application.
Voir le code complet → · Démarrage rapide · Voir l’intégration comptée et les reprises →
Le SDK exécute seulement les opérations autorisées. RunFeature ne déduit aucun usage ; RunMeteredFeature réserve, confirme le succès et annule l’échec. Reprendre la tâche initiale confirme sans répéter l’opération terminée.
Afficher les requêtes et réponses HTTP (clients personnalisés ou dépannage)
Le protocole ci-dessous est implémenté par les SDK. Les applications utilisant ces neuf SDK n’ont pas à le réimplémenter.
Ces huit interfaces authentifient licence et appareil, sans cookies, CSRF ni clé de gestion. Les sessions flottantes sont libérées à l’arrêt ; les appareils liés restent enregistrés.
Comment vérifier l’accès après activation, vérification ou heartbeat ?
- Vérifiez HTTP 200 et lisez
data.activation_id. Joignez cet ID aux vérifications, heartbeats, comptages et libérations suivants. - Vérifiez avec la clé publique du produit préapprouvée
data.leasepuis vérifiez produit, appareil, validité et fonctionnalités. Décoder payload en JSON ne prouve pas la validité de l’autorisation. - Le SDK automatise les deux premières étapes. RunFeature vérifie l’accès avant le travail ; RunMeteredFeature gère réservation, confirmation et annulation pour les compteurs.
Le SDK conserve le cache signé et envoie les heartbeats selon la stratégie. N’effacez pas un cache valide pour un simple délai réseau. En cas de révocation, libération ou expiration explicite, bloquez les fonctions protégées selon le résultat du SDK.
Que signifient les champs du payload décodé ?
L’exemple explique les données. Pour vérifier la signature vous-même, utilisez les octets originaux de payload reçu ; ne réordonnez ni ne sérialisez le JSON.
Tentatives, heartbeats et facturation
Requis pour activation, libération et comptage Idempotency-Key, jusqu’à 80 caractères sans espace. Nouvelle opération : nouvelle valeur ; nouvelle tentative : mêmes valeur et corps. Facultatif pour vérification et heartbeat ; le SDK gère ses propres identifiants.
Chaque activation, vérification, heartbeat ou déliage réussi consomme un appel API. Échecs et répétitions idempotentes ne sont pas recomptés ; CheckFeature reste local. Consume déduit les usages de la fonction, pas ce quota API ; quantity indique leur nombre.
Heartbeat, durée hors ligne et permanent suivent Politiques de licence.payload.expires_at indique l’expiration du cache signé actuel, pas celle de la licence. L’échéance finale figure dans les détails de la licence.
Heartbeats et accès hors ligne
Les deux réglages sont dans les stratégies d’autorisation, mais distinguent la fréquence de contact en ligne et la durée d’usage sans réponse du serveur.
Intervalle : fréquence de vérification
Réglez Intervalle de heartbeat (secondes) sur 600, le SDK envoie une pulsation environ toutes les 10 minutes pendant son exécution. Chaque réussite récupère les dernières règles et actualise le cache local de licence.
Saisissez 600–86400 secondes. Saisissez 0 désactive les battements programmés. L’application peut toujours vérifier ou actualiser manuellement. Un délai aléatoire de 0–10 % est ajouté ; l’intervalle ne descend jamais sous 600 secondes.
Avec une licence liée à l’appareil et un cache valide, le démarrage rétablit l’accès puis vérifie en arrière-plan, même sans minuterie. Les licences en ligne uniquement et flottantes attendent la confirmation du serveur.
Hors ligne : durée d’usage sans serveur
Trois choix de mode hors ligne, sans modifier l’intervalle de heartbeat.
- Autoriser pendant une durée définie
- Avec 24 heures, le cache signé reste valable au maximum 24 heures après la dernière vérification en ligne réussie. Une coupure réseau ou une panne temporaire n’empêche pas l’usage pendant ce délai. Ensuite, une vérification en ligne doit réussir.
- Repli hors ligne interdit
- Le démarrage exige une réponse du serveur ; le cache disque ne contourne pas un échec. La signature courte reçue pendant l’exécution dure au maximum
max(10, 心跳间隔)secondes ; l’application doit poursuivre les vérifications et les contrôles de droits. - Autoriser un accès hors ligne permanent
- La signature locale peut servir durablement, même en cas de panne réseau. Une licence de 30 jours expire toujours au bout de 30 jours : le mode hors ligne permanent ne rend pas la licence perpétuelle.
L’API utilise offline_mode représente ces trois choix, dans l’ordre limited, none, permanent. Avec une durée hors ligne définie,offline_seconds vaut 1–31536000 secondes ; 0 pour les deux autres modes.
Comment fonctionnent ces combinaisons ?
| Réglages heartbeat / hors ligne | Comportement réel |
|---|---|
| 10 minutes / 24 heures | Vérifiez toutes les 10 minutes en ligne. Hors ligne, utilisez jusqu’à 24 heures après la dernière vérification réussie |
| 10 minutes / hors ligne permanent | Heartbeat toutes les 10 minutes ; règles actualisées si réussi, signature valide si injoignable. |
| 0 / hors ligne permanent | Avec un cache valide, démarrez sans requêtes programmées. Vérification ou actualisation explicite contacte toujours le serveur |
| 0 / 24 heures | Pas de heartbeat programmé, mais le cache expire. L’application planifie la vérification ; désactiver ne prolonge pas le hors ligne. |
Prévoyez une durée hors ligne supérieure à l’intervalle. Avec un heartbeat par heure mais une minute hors ligne, la signature expire avant le suivant : l’application doit vérifier séparément.
Une règle modifiée actualise-t-elle les licences existantes ?
Oui. Les réglages modifiés s’appliquent aux anciennes et nouvelles licences liées lors de la prochaine activation, vérification ou heartbeat réussi. Le SDK remplace le cache signé. Un même Idempotency-Key renvoie toujours le résultat de la requête initiale.
Un appareil hors ligne utilise ses règles signées existantes. La reconnexion seule ne change pas le cache : une requête doit réussir. L’application peut lancer une actualisation au retour du réseau.
Durée, limite d’appareils et fonctions sont propres à chaque licence. Modifier la stratégie ne les remplace pas automatiquement. Modifiez ces droits sur la page Licences.
Actualisation en ligne à la demande
Ces méthodes contactent toujours le serveur, même en mode hors ligne permanent sans heartbeat. Le succès renouvelle la signature. Un échec réseau signale l’erreur et conserve un cache encore valable ; une révocation ou libération explicite l’efface.
| Langue | Méthode d’appel |
|---|---|
| Go | client.RefreshOnline(ctx) |
| Java | client.refreshOnline() |
| C | ln_refresh_online(client) |
| C++ | client.RefreshOnline() |
| C# | await client.RefreshOnline() |
| Python | client.refresh_online() |
| JavaScript | await client.refreshOnline() |
Une actualisation réussie compte comme une activation API. Si la stratégie active les heartbeats auparavant désactivés, appelez StartHeartbeat pour démarrer leur planification. Hors ligne, l’appareil ne reçoit pas les révocations ou libérations.
Liaison aux appareils
Avec une licence pour un seul appareil, copier le logiciel et son cache sur un autre ordinateur ordinaire ne transfère pas l’autorisation.
Comment le SDK identifie-t-il l’ordinateur ?
À chaque démarrage, le SDK lit l’identité système et calcule un hash avec l’identifiant produit. La signature du serveur contient ce hash, également vérifié en local.
Windows lit MachineGuid, Linux machine-id et macOS IOPlatformUUID. Seul le hash calculé est envoyé, pas l’identité brute. L’ancien champ de configuration device_id ne remplace pas l’identité locale réelle.
Que se passe-t-il si les fichiers de A sont copiés sur B ?
- A reçoit une signature liée à son hash d’appareil.
- B lit son identité, obtient un autre hash et refuse le cache de A.
- B doit s’activer en ligne. Avec une limite d’un appareil et A encore lié, le serveur refuse B.
Comment un client change-t-il d’ordinateur ?
Le client délie l’ancien ordinateur, puis active le nouveau. Si l’ancien est endommagé, libérez-le depuis Activations d’appareils dans la console. Le changement ne réinitialise pas l’échéance.
Une réinstallation peut changer l’identité du système et nécessiter une nouvelle activation. Clonage complet, identité falsifiée ou client modifié sont des attaques plus fortes : ce hash seul ne garantit pas leur blocage.
Avec une longue durée hors ligne, la signature de A ignore sa libération jusqu’à une requête serveur réussie. Plus la durée est longue, plus l’application des restrictions à distance est retardée.
Hash d’appareil entre langages
SHA256(UTF8(
"LicenovaDevice/v2\n"
+ lower(product_id) + "\n"
+ lower(trim(OS_machine_identity))
))Quotas et facturation
Le quota d’appareils compte les appareils utilisés ; le quota API compte les requêtes réussies. Mesures distinctes : le nombre d’appareils ne détermine pas l’usage API.
Quelles opérations comptent dans le quota API ?
| Action | Comptabilisé ? |
|---|---|
| Activation, vérification, heartbeat ou libération réussis | Chaque succès compte ; tous les heartbeats d’une même journée sont comptés séparément. |
| Requêtes échouées : clé invalide ou quota insuffisant | Non compté |
| Réessayer avec le même Idempotency-Key et renvoyer le résultat initial | Pas compté à nouveau |
| CheckFeature local ou contrôle de cache signé | Non compté ; aucune requête serveur |
| Consulter ou émettre des licences avec une clé API de gestion | Non inclus dans ce quota API d’exécution |
Plusieurs requêtes comptent-elles plusieurs fois un appareil ?
Non. Sur une période, le même appareil d’un produit compte une fois, mais chaque heartbeat réussi compte comme usage API. Sa libération n’efface pas l’usage déjà enregistré.
Exemple : 100 appareils, 8 heures par jour, 22 jours par mois, heartbeat toutes les 10 minutes. Les heartbeats seuls représentent 105 600 appels. Ajoutez 100 activations et une vérification par appareil et par jour, soit 107 900 appels.
Ces vérifications sont des hypothèses ; l’usage dépend de l’application. Dans Estimation de l’usage en ligne modifiez appareils, durée et intervalle.
Comment facture-t-on le dépassement ?
Avec 100 000 appels inclus et 0,0001 USD par appel supplémentaire : 120 000 appels réussis font 20 000 en dépassement, soit des frais de 2 USD.
Les dépassements autorisés débitent le solde au tarif administrateur. Le montant cumulé est arrondi au centime ; seule la différence nouvelle est débitée, sans frais répétés d’arrondi par appel.
Le dépassement d’appareils est distinct : appareils supplémentaires × prix unitaire. Une limite stricte bloque le dépassement concerné ; un solde insuffisant bloque aussi la prochaine requête payante. Un refus n’ajoute pas d’usage.
Un quota API illimité n’a pas de frais de dépassement. Zéro signifie aucun appel gratuit : les règles s’appliquent dès le premier succès. Quotas, prix et limites figurent dans Forfait actuel, ces chiffres sont des exemples.
Quand commencent la durée et les quotas ?
Achetez 1, 3, 6 ou 12 mois. Réglez le total en une fois ; le forfait démarre après paiement.
Les quotas sont renouvelés chaque mois à partir de l’activation. Un début le 31 janvier donne le dernier jour de février puis le 31 mars. Aucun report.
Sans forfait acheté, les règles administrateur suivent le mois civil UTC. Appareils : facture mensuelle ; dépassement API : débit immédiat. Après achat, seuls les quotas de sa période s’appliquent, sans cumul des quotas par défaut.
Un refus pour quota ou solde insuffisant n’annule pas la signature hors ligne, soumise à ses règles d’origine. Le fournisseur peut libérer l’appareil dans la console sans consommer le quota API d’exécution.
Postes flottants
La licence flottante limite les programmes exécutés simultanément. Elle permet de partager le logiciel à tour de rôle, sans acheter une licence par ordinateur.
Exemple
Avec 100 ordinateurs et 10 places, les 10 premiers programmes démarrent, le 11e reçoit « Aucune place ». Une fermeture normale du programme et du SDK libère la place. Deux programmes sur un ordinateur occupent deux places.
Définissez dans la règle
Choisissez les sièges flottants et une limite de 10. Intervalle minimum : 600 s ; bail plus long, par exemple 1200 s. Les battements renouvellent le bail ; après panne ou déconnexion, l’expiration libère le siège.
La licence flottante permet une brève coupure pendant le bail. La durée hors ligne reste limitée par ce bail ; ni mode permanent ni première activation totalement hors ligne par fichier.
Que doit aussi gérer l’application ?
Utilisez Open/Start puis la fermeture normale. Le SDK crée un identifiant de session par client. Ne créez pas un client par export ; gardez-en un jusqu’à la fermeture du programme.
Un ancien cache flottant ne rétablit pas la place au prochain démarrage. Si le bail a expiré, réactivez et obtenez une place avant de reprendre.
Activation hors ligne
Pour un ordinateur sans réseau, utilisez un fichier de demande et une réponse signée pour la première activation. Transportez la demande par clé USB vers un ordinateur connecté.
Étapes
- Sur l’ordinateur cible, chargez la configuration, appelez OfflineRequest("activate") et gardez le fichier. Sa création ne contacte pas le serveur.
- Sur un ordinateur connecté, ouvrez Activation par fichier hors ligne, téléversez la demande et téléchargez la réponse. Le client final peut aussi utiliser son portail.
- Rapportez la réponse et appelez ImportOffline avec demande et réponse d’origine. Le SDK vérifie signature, identifiant de demande, version et identité locale avant de garder le cache.
- Vérifiez l’autorisation avec CheckFeature. Un ordinateur hors ligne n’a pas besoin de heartbeat en ligne ; la stratégie définit la durée hors ligne.
L’activation par fichier exige une licence liée autorisant le mode hors ligne. La demande dure 30 jours. Une licence à durée fixe commence à l’approbation serveur, qui ignore la date d’importation de la réponse.
Comment libérer hors ligne ?
Sur l’ancien ordinateur, générez OfflineRequest("deactivate"). Le SDK efface d’abord le cache ; transmettez ensuite la demande au fournisseur ou portail. Cela ne prouve pas l’absence de copies antérieures. Pour un blocage rapide, exigez des vérifications en ligne régulières.
Noms par langage
| Langue | Générer la demande | Importer la réponse |
|---|---|---|
| Go | OfflineRequest("activate") → []byte | ImportOffline(requestBytes, responseBytes) |
| Java | offlineRequest("activate") → texte JSON | importOffline(requestText, responseText) |
| JavaScript | offlineRequest("activate") → object | importOffline(requestObject, responseObject) |
| C | ln_offline_request(client, "activate") | ln_import_offline(client, requestText, responseText) |
| C++ / C# | OfflineRequest("activate") → texte JSON | ImportOffline (texte en C++, octets en C#) |
| Python | offline_request("activate") → dict | import_offline(requestDict, responseDict) |
En C, libérez le texte retourné avec ln_free_string. Fournissez le contenu du fichier de réponse, pas l’enveloppe data de l’API web.
Limites d’utilisation des fonctions
L’autorisation d’exporter diffère de 500 exports par mois. RunFeature vérifie l’accès ; RunMeteredFeature confirme l’usage après réussite.
Autoriser 500 exports par mois
Ajoutez export aux fonctions, puis un quota : export, 500, Mensuel. Par défaut, l’usage est refusé après épuisement. Pour autoriser un dépassement, fixez son maximum ; le système le comptabilise pour votre système de commandes.
Quotas quotidiens et mensuels renouvelés à minuit UTC ; quotas cumulés sans remise à zéro. Changer la limite n’efface pas l’usage consommé.
Confirmer l’utilisation après un export réussi
Passez votre fonction métier au SDK. Nouveau travail : nouvel ID ; reprise : mêmes ID, fonction et quantité. Ne lancez pas le même ID dans plusieurs processus.
| Langue | Appel d’opération comptée |
|---|---|
| Go | client.RunMeteredFeature(ctx, "export", 1, jobID, exportReport) |
| Java | client.runMeteredFeature("export", 1, jobID, this::exportReport) |
| Node.js | await client.runMeteredFeature("export", 1, jobID, exportReport) |
| Python | client.run_metered_feature("export", 1, job_id, export_report) |
| C# | await client.RunMeteredFeature("export", 1, jobID, ExportReport) |
| C++ | client.RunMeteredFeature("export", 1, jobID, exportReport) |
| Rust | client.run_metered_feature("export", 1, &job_id, || export_report())? |
| Ruby | client.run_metered_feature("export", 1, job_id) { export_report } |
| C | ln_run_metered_feature(client, "export", 1, job_id, export_report, context) |
Configurez d’abord le quota export. Ajoutez -Metered -OperationID export-job-001 sous Windows ou --metered --operation-id export-job-001 sous Linux/macOS.
Si le travail réussit mais pas la confirmation, une reprise ne fait que confirmer. Un crash pendant le travail bloque la répétition automatique. Vérifiez le résultat durable puis utilisez ResolveMeteredFeature. L’usage distant et le travail local ne forment pas une transaction unique.
Pour contrôler vous-même les réservations
- Créez et conservez un identifiant de tâche pour cet export.
- Réservez une unité et exportez seulement après pending. committed indique une tâche déjà terminée ; ne la répétez pas.
- Après un export réussi et l’enregistrement du résultat, appelez Commit pour confirmer l’utilisation.
- Si l’export échoue avant la fin, appelez Cancel pour libérer la réservation sans débiter d’unités.
Une réservation dure 15 minutes par défaut, raccourcies au changement de période UTC. L’API permet reservation_seconds de 30 à 3600 secondes.
| Langue | Réserver | Confirmer / Annuler |
|---|---|---|
| Go | Reserve(ctx, "export", 1, jobID) | Commit / Cancel(ctx, hold.ID, jobID) |
| Java / Node.js | reserve("export", 1, jobID) | commit / cancel(id, jobID) |
| C | ln_reserve(client, "export", 1, jobID) | ln_commit / ln_cancel(client, id, jobID) |
| C++ / C# | Reserve("export", 1, jobID) | Commit / Cancel(id, jobID) |
| Python | reserve("export", 1, jobID) | commit / cancel(id, jobID) |
Comment lire les champs de réponse ?
| Champ | Signification |
|---|---|
| reservation_id / operation_id | Identifiant de réservation et de tâche d’origine ; conservez les mêmes valeurs lors des reprises. |
| status / expires_at | État et échéance : pending attend la fin, committed est débité, canceled est libéré, expired a expiré. |
| consumption.used / reserved | Utilisations confirmées sur la période / unités réservées par toutes les tâches valides. |
| consumption.limit / remaining | Quota de base / unités de base disponibles. remaining = max(0, limit - used - reserved), hors dépassement autorisé. |
| consumption.quantity / overage | Unités de cette tâche / unités confirmées au-delà du quota de base ; aucun paiement client n’est encaissé. |
| consumption.period / reset_at | Période UTC / prochaine remise à zéro ; un quota à vie a reset_at = null. |
Pour les requêtes, réponses et types de champs, consultez Reserve, Commit et Cancel dans la référence de l’API d’exécution.
Après réussite, n’annulez pas et ne répétez pas l’export. Conservez identifiants et résultat puis réessayez Commit. Si la réservation a expiré, gardez la tâche pour rapprochement. Le débit distant et l’action locale ne partagent pas une transaction atomique.
Consume débite toujours immédiatement. Utilisez la réservation pour ne pas facturer une action échouée. Tous les compteurs fonctionnels exigent une connexion et sont exclus des quatre appels API facturables de la plateforme.
Versions et maintenance
Un achat perpétuel autorise l’usage durable, pas forcément les mises à niveau gratuites à vie. La maintenance détermine les versions éligibles selon leur date de publication.
Acheter la version actuelle, un an de mises à jour inclus
Choisissez Perpétuelle et 365 jours de maintenance, comptés dès la première activation. Publiez 1.0.0, 1.1.0, etc. dans Versions du logiciel avec leurs dates réelles.
Les versions publiées pendant la maintenance restent utilisables. Les suivantes sont refusées, les anciennes fonctionnent encore. Après renouvellement, prolongez la maintenance dans Droits et client de la licence.
Comment l’application transmet-elle sa version ?
Renseignez app_version dans sdk-demo.json, par exemple 1.1.0. Avec maintenance, publiez d’abord cette version. Seules les versions numériques à trois parties, comme 1.2.3, sont acceptées. La date publiée est immuable pour préserver les droits vendus.
Pour limiter à 1.x, fixez 1.0.0–1.999.999 sans maintenance. Après mise à jour, connectez-vous pour recevoir la signature de la nouvelle version ; l’ancien cache ne l’autorise pas.
Proposer un téléchargement
Les versions peuvent contenir URL HTTPS et empreinte SHA-256. Le portail n’affiche que les versions autorisées. Ces enregistrements fournissent un lien, sans héberger l’installateur ni installer automatiquement les mises à jour.
Portail client
Les clients consultent leurs licences et appareils et les délient sans accéder à la console fournisseur.
Le fournisseur associe d’abord l’adresse du client
Renseignez l’e-mail à l’émission ou dans Droits et client. Envoyez le Portail client au client. En saisissant cette adresse, il reçoit un lien à usage unique valable 15 minutes. La session dure 24 heures.
Le client voit uniquement les licences de cette adresse, pas vos produits, factures ou données d’autres clients. Configurez d’abord le service email dans les réglages administrateur.
Que faire si le client a perdu sa clé en changeant d’ordinateur ?
- Le client saisit l’adresse associée à la licence et ouvre le lien reçu. Ce lien connecte au portail, sans délier d’appareil.
- Dans Mes appareils / sessions, choisissez l’ancien, Libérer et transférer, puis confirmez.
- La page affiche un code temporaire, valable au plus 15 minutes et pour une seule activation réussie. Le client peut le copier ou demander son envoi par email.
- Sur le nouvel ordinateur, ouvrez le logiciel et saisissez le code temporaire. Le SDK identifie l’appareil, lie la licence d’origine et garde ses identifiants. Redémarrages et heartbeats utilisent ces identifiants ; l’expiration du code n’affecte pas l’activation.
Seule la liaison change. Identifiant, échéance d’origine, fonctions, client et usages consommés restent ; aucune nouvelle licence n’est émise. Le nouvel appareil doit respecter la stratégie et disposer d’une place libre.
Que doit modifier le fournisseur du logiciel ?
Passez au SDK actuel. Le champ de clé de licence accepte aussi lv_tmp_ codes temporaires ; placez-en un dans license_key suffit ; Start, la validation et les battements restent inchangés. Le SDK conserve l’identifiant de l’appareil dans un cache privé ;cache_path peut être vide. Conservez ce fichier dans les données de l’utilisateur courant ; ne le distribuez jamais avec l’installeur.
Après échange réussi, l’application peut effacer license_key vide ; gardez mêmes produit, clés et cache_path, le SDK restaure les identifiants de l’appareil au redémarrage. Le client n’a pas à conserver ni ressaisir le code temporaire. Gardez la saisie tant que l’échange n’a pas réussi, pour réessayer après une coupure.
Si le code expire ou la page est fermée
Reconnectez-vous pour voir les codes inutilisés. Après expiration d’un code non utilisé, demandez-le à côté de l’appareil libéré, sans compter un autre transfert. Un code utilisé ne peut être échangé ni repris depuis l’ancien appareil pour contourner les limites. Pour un nouveau transfert, déliez l’appareil actuel.
Si le nouvel ordinateur est entièrement hors ligne
Sur le nouveau poste, saisissez le code et exportez la demande avec le SDK. Avant expiration du code, obtenez la réponse sur un poste connecté via le portail, puis importez-la. La stratégie doit permettre l’activation hors ligne liée à l’appareil. L’échéance d’origine reste ; protégez le fichier contenant autorisation et identifiants de ce poste.
Limites de libération et ancien ordinateur
Définissez la limite de libérations autonomes par licence et mois UTC. Zéro désactive les nouveaux déliages du portail. Clics répétés, consultation et réémission d’un code inutilisé expiré ne comptent pas davantage. La limite couvre portail et demandes hors ligne client, pas libérations manuelles fournisseur ni appels logiciels avec la clé d’origine.
Le déliage distant bloque la prochaine vérification en ligne. L’ancien cache reste valable jusqu’au contact ou à son expiration. Un cache hors ligne permanent ne peut pas être arrêté immédiatement ; exigez des contrôles réguliers pour une révocation rapide. Une copie normale sur un autre poste est refusée car son identité diffère.
Le portail gère l’usage des licences. Les commandes et encaissements du logiciel restent dans le système du fournisseur.
Notifications d’événements
Lors d’une activation, d’un renouvellement ou d’une révocation, Licentivo peut notifier votre serveur pour synchroniser commandes, clients et support.
Ajouter une adresse de notification
Dans Notifications d’événements, ajoutez l’URL HTTPS du serveur et choisissez les événements. Le secret est affiché une seule fois : gardez-le sur le serveur destinataire. En production, adresses locales et privées sont interdites.
Vérifiez la signature à réception
Lisez X-Licentivo-Timestamp, X-Licentivo-Event et le corps brut. Assemblez horodatage + '.' + ID d’événement + '.' + corps, calculez HMAC-SHA256 avec le secret, ajoutez sha256= et comparez à X-Licentivo-Signature en temps constant. Refusez un écart supérieur à 5 minutes.
Dédupliquez par ID d’événement. Vérifiez la signature, placez l’événement dans une transaction ou file et répondez 2xx après stockage durable. Un doublon reçoit 2xx sans répéter l’action.
Que se passe-t-il en cas d’échec ?
Jusqu’à 8 tentatives automatiques, avec pauses croissantes. La console affiche statut HTTP, date et erreurs, et permet un nouvel envoi manuel. Événement et opération de licence partagent la transaction ; l’envoi reprend après redémarrage.
Événements : création, mise à jour, renouvellement, révocation, activation, libération, consommation, échéance proche, expiration et maintenance. La notification contient le préfixe, jamais la clé complète.
Opérations groupées et changements de règles
Émettez, renouvelez ou révoquez en lot pour traiter les clients ensemble. Prévisualisez l’impact avant de changer les droits existants.
Émettre en lot ou importer
Dans Licences, choisissez Émission/import en lot, puis produit et stratégie. Saisissez nom et email par ligne ou importez un CSV avec en-tête customer,customer_email. Maximum 100 lignes. Téléchargez le résultat et gardez les clés complètes.
Si une ligne échoue, tout le lot reste sans effet. Après un délai réseau, gardez le contenu et réessayez : l’identifiant de requête renvoie le résultat initial sans nouvelle émission.
Renouveler ou révoquer en lot
Cochez les licences puis Renouveler ou Révoquer en lot. La case d’en-tête sélectionne la page ; les choix restent entre pages, maximum 100. Changer les filtres, quitter ou actualiser efface la sélection.
Saisissez les jours ajoutés. Non activée : durée accrue ; active : échéance prolongée ; expirée : prolongation à partir de maintenant. Avant révocation, développez la sélection pour vérifier les clients. Elle est irréversible. Les membres en lecture seule ne peuvent pas agir.
Appliquer une nouvelle règle aux licences existantes
- Enregistrez les règles dans Règles de licence.
- Sélectionnez les licences d’un produit, puis Appliquer la règle et choisissez la nouvelle.
- Vérifiez durée, appareils/places, fonctions, usages et maintenance. Si les places occupées dépassent la nouvelle limite, ou si des appareils actifs subsistent lors du changement de mode, traitez-les d’abord.
- Appliquez après confirmation. La prochaine vérification en ligne reçoit une nouvelle signature ; les caches entièrement hors ligne ne changent pas à distance.
La prévisualisation dure 10 minutes. Si licence ou stratégie change, recommencez. Une nouvelle durée recalcule l’échéance depuis la première activation d’origine : vérifiez les dates proposées.
Questions fréquentes
Vérifiez le code d’erreur, puis les réglages associés. Dans la réponse, request_id aide à retrouver l’opération. Pas de clé complète dans journaux ou captures.
Que vérifier si l’activation échoue ?
Vérifiez l’accès au serveur, l’identifiant du produit, la clé complète et son appartenance au produit. Avant déploiement, les clients ne peuvent pas utiliser votre 127.0.0.1 : cette adresse désigne l’ordinateur du client.
| Code d’erreur | Première étape |
|---|---|
LICENSE_INVALID | Vérifiez ID produit, clé complète et produit de la licence |
LICENSE_EXPIRED | Voir l’échéance ; renouvellement par le fournisseur |
LICENSE_REVOKEDDEVICE_RELEASED | Licence révoquée ou appareil libéré ; cache effacé |
DEVICE_LIMIT_REACHED | Places pleines ; libérez un appareil ou augmentez la limite |
API_QUOTA_EXCEEDED | Quota API épuisé ; vérifiez période et forfait |
API_BALANCE_INSUFFICIENT | Solde de dépassement API insuffisant ; vérifiez devise et environnement |
MONTHLY_QUOTA_EXCEEDED | Quota appareils de plateforme atteint, distinct de celui de la licence |
IDEMPOTENCY_CONFLICT | Même clé, corps différents ; nouvelle opération nouvelle clé, répétition même corps |
IDEMPOTENCY_EXPIRED | Réponse ou lien invalide ; vérifiez l’état, nouvelle clé pour nouvelle opération |
Pourquoi fonctionne-t-il encore hors ligne ?
Hors ligne, le SDK vérifie localement signature, produit, appareil, fonctions et expiration ; seule la requête serveur manque. Un cache expiré ou une révocation/libération reçue en ligne bloque l’usage.
Pourquoi la signature ou l’appareil n’est-il pas vérifié ?
Une clé publique différente, le cache d’un autre produit ou une copie sur un autre ordinateur peuvent provoquer l’échec. Vérifiez trusted_keys contient l’identifiant de clé et la clé publique du produit actuel, puis vérifiez si le système a été changé ou réinstallé.
Le SDK signale clock rollback : vérifiez un recul de l’horloge. Corrigez et actualisez en ligne.
Réponse d’erreur complète
{
"error": {
"code": "LICENSE_REVOKED",
"message": "License was revoked"
},
"request_id": "99999999-9999-4999-8999-999999999999"
}| Champ | Signification et action |
|---|---|
error.code · string | Identifiant stable pour la logique, pas le texte de message. |
error.message · string | Raison lisible pour diagnostic ou message client. |
request_id · UUID | ID de requête serveur pour journaux ; ni licence ni Idempotency-Key. |
400/415 : corrigez les champs ou Content-Type ; 401 : vérifiez la clé ; 403 : suivez le code d’autorisation ; 409 : quota, session ou conflit d’idempotence ; 429 : attendez selon Retry-After. Réessayez les délais dépassés ou 5xx avec une pause. Pour écrire, gardez identifiant et corps d’origine afin d’éviter un double comptage.
Comment lire la réponse JSON ?
Réponse réussie data et request_id ; l’échec renvoie error.code, error.message et request_id. Gardez code d’erreur et request_id pour le diagnostic.
Pour e-mail, paiement ou déploiement, consultez Assistance et dépannage.
Retrouvez tous les champs de l’API dans le Fichier OpenAPI.