Licences
TreatmentConsultant vérifie une clé de licence localement, dans le navigateur : signature, expiration et domaine sont tous vérifiés hors ligne, sans composant serveur requis. Si la clé est absente, invalide, expirée, ou non valable pour le domaine actuel, le widget affiche un filigrane en surimpression. Le parcours en dessous reste pleinement interactif dans tous les cas : le filigrane est purement visuel, un cas limite de licence ne casse donc jamais le parcours de réservation réel pour un vrai visiteur.
En plus de cette vérification locale, le widget effectue aussi une vérification distante en cache et au mieux auprès de l'API de licence de GuideMyHair, une fois toutes les 24 heures par clé de licence, pas à chaque chargement de page, pour détecter une licence annulée ou expirée côté serveur alors que son jeton reste valablement signé et non expiré. Cette vérification échoue en mode permissif : une erreur réseau ou un serveur GuideMyHair injoignable ne révoque jamais une licence valide localement, seule une réponse explicite « inactive » le fait. Le site de votre client n'est jamais cassé par notre disponibilité.
Voyez-la fonctionner avec une véritable clé de licence sur notre page de démo en direct.
Obtenir une clé
Achetez une offre sur la page des tarifs et votre clé de licence vous est envoyée automatiquement par e-mail. C'est un jeton signé : traitez-le comme n'importe quelle autre clé d'API (ne le publiez pas dans un dépôt public), mais il est sans risque de l'inclure dans votre bundle côté client, puisqu'il ne fait que prouver un droit d'usage, il ne donne accès à rien de sensible.
Transmettre la clé
Transmettez-la en tant que prop sur une seule instance, ou une fois via le plugin pour couvrir toutes les instances de votre application : une prop l'emporte toujours sur la clé du plugin si les deux sont définies.
<TreatmentConsultant license-key="eyJhbGciOi..." />// app/plugins/hair-treatments.ts
import { createHairTreatments } from "srcdev-hair-treatments"
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(createHairTreatments({ licenseKey: "eyJhbGciOi..." }))
})Correspondance de domaine
Chaque licence est verrouillée sur un ou plusieurs domaines, définis sur votre compte. Le nom d'hôte de la page actuelle est vérifié par rapport à cette liste :
localhostet127.0.0.1sont toujours autorisés, le développement local n'a donc jamais besoin d'une véritable clé.- Un domaine simple (
example.com) couvre aussi sa versionwww., et inversement : inutile de lister les deux. - Une entrée générique (
*.example.com) couvre tout sous-domaine de ce domaine,staging.example.com,preview.example.com, etc., mais pas le domaine nu lui-même, associez-la donc à une entrée simpleexample.comsi vous avez besoin des deux. - Les domaines d'hébergement de prévisualisation partagés,
*.vercel.app,*.netlify.app, et similaires, ne sont jamais pris en charge, sur aucune licence, en aucune circonstance. Ce domaine n'est pas le vôtre à licencier : il est partagé avec toutes les autres applications hébergées sur la même plateforme, l'autoriser reviendrait donc à autoriser tout le monde. Attendez-vous au filigrane sur les déploiements de prévisualisation : pointez plutôt un sous-domaine de votre propre domaine vers le déploiement si vous avez besoin d'une prévisualisation sans licence à partager.
Besoin d'ajouter ou de modifier des domaines sur une licence existante, par exemple pour ajouter un sous-domaine de préproduction ? Contactez-nous.
Content-Security-Policy
Si votre site définit une directive connect-src, ajoutez-y https://guidemyhair.com : c'est la vérification distante décrite ci-dessus, et une requête bloquée est identique à une erreur réseau du point de vue du widget, elle échoue donc silencieusement en mode permissif plutôt que d'afficher une erreur visible. Vous obtiendrez quand même un avertissement spécifique dans la console (« bloqué par Content-Security-Policy » contre un message d'échec réseau générique), consultez donc la console de votre navigateur en cas de doute.
Raisons du filigrane
| Raison | Affiché quand |
|---|---|
| Aucune clé de licence fournie | Ni la prop ni le plugin n'ont de clé définie |
| La clé de licence n'a pas pu être vérifiée | La clé est mal formée, ou n'a pas été signée par GuideMyHair |
| Cette licence a expiré | Passé la date d'expiration de la licence (abonnements uniquement : les licences à vie n'expirent jamais) |
| Cette licence n'est pas valable pour ce domaine | Le nom d'hôte actuel n'est pas couvert par les domaines de la licence, voir Correspondance de domaine ci-dessus |
| Cette licence n'est plus active | La vérification distante quotidienne a reçu une réponse explicite « inactive » : la licence a été annulée ou a expiré côté serveur |