Authentification JWT
Identifiez les utilisateurs dans votre widget d'aide sans exiger de connexion distincte. Lorsque les utilisateurs sont connectés à votre application, vous pouvez transmettre leur identité à Ferndesk à l'aide d'un jeton JWT signé par votre backend.
Vous aurez besoin de votre secret JWT dans Centre d'aide > Contrôle d'accès ainsi que du SDK Ferndesk installé.
L'identification JWT est disponible sur tous les forfaits et fonctionne en modes d'accès Ouvert et Verrouillé. Vous n'avez pas besoin de verrouiller votre centre d'aide ni de passer à une offre supérieure pour générer un secret.
Fonctionnement
Flux en trois étapes :
Votre frontend détecte un utilisateur connecté
Votre backend génère un JWT signé avec les informations de l'utilisateur
Votre frontend appelle
Ferndesk('identify', { jwt })
Le centre d'aide et le widget savent désormais qui est l'utilisateur pour l'authentification, la personnalisation et les analyses.
La méthode identify ne fonctionne que depuis le même domaine que votre centre d'aide ou un sous-domaine de niveau 1. Si votre centre d'aide est sur help.example.com, vous pouvez effectuer l'identification depuis app.example.com, mais pas depuis otherdomain.com.
Secret JWT
Avant de pouvoir signer des JWT, vous avez besoin d'un secret de signature depuis votre tableau de bord Ferndesk :
Accédez à Centre d'aide > Contrôle d'accès.
Dans la section Identification de l'utilisateur, développez la ligne JWT identify.
Cliquez sur Générer le secret.
La génération d'un secret active automatiquement l'authentification JWT pour votre centre d'aide. Le secret n'est affiché qu'une seule fois. Copiez-le immédiatement et stockez-le de manière sécurisée dans les variables d'environnement de votre backend. Vous ne pourrez plus le consulter.
Si vous devez faire pivoter le secret, cliquez sur Régénérer. Cela remplace le secret existant et invalide tous les jetons signés avec l'ancien. Mettez à jour votre backend avec le nouveau secret avant que les utilisateurs ne soient affectés.
Vous ne pouvez avoir qu'un seul secret JWT par centre d'aide. Générer le secret n'est disponible que lorsqu'aucun secret n'existe. Régénérer est disponible lorsqu'un secret existe déjà.
Connexion via le navigateur pour les clients MCP et IA
L'identification JWT fonctionne en arrière-plan dans votre produit. Les clients IA connectent les utilisateurs via un navigateur à la place.
Dans JWT identify sous Connexion via le navigateur (clients MCP et IA) :
Saisissez l'URL de votre page de connexion SSO. Ferndesk redirige les utilisateurs ici avec un paramètre
return_to. Après la connexion, redirigez versreturn_toavec un paramètre de requêtejwt.Activez éventuellement Autoriser la connexion par e-mail pour les clients IA afin que les utilisateurs existants puissent prouver qu'ils possèdent l'adresse e-mail lors de la connexion d'un client IA. Laissez cette option désactivée si les attributs utilisateur protègent du contenu sensible.
Cliquez sur Enregistrer les modifications.
Utilisez une URL valide commençant par http: ou https:. Les valeurs non valides affichent Saisissez une URL de page de connexion valide, y compris https://.
Connexe : Utiliser Ferndesk avec des outils d'IA · Permettre aux lecteurs d'utiliser votre centre d'aide dans des outils d'IA
Générez le JWT côté serveur
Créez un endpoint qui renvoie un jeton signé. Ferndesk n'exige pas les claims iss (issuer) ni aud (audience).
Claims requis :
sub(string, required): ID unique dans votre système qui identifie cet utilisateur. Il s'agit de la clé d'identité principale.email(string, required): Adresse e-mail de l'utilisateurexp(number, required): Horodatage d'expiration du jetoniat(number, required): Horodatage d'émission du jeton
Claims facultatifs :
name(string, optional): Nom affichécustomAttributes(object, optional): Attributs utilisateur supplémentaires. Vous pouvez également utilisermetadata; les deux clés sont acceptées.
Le claim sub doit rester stable pour chaque utilisateur. Ferndesk utilise ce subject pour identifier et associer les utilisateurs. Si le sub d'un utilisateur change, il ne sera pas associé à son identité précédente dans le centre d'aide.
Exemple Node.js :
const jwt = require('jsonwebtoken');
app.get('/api/ferndesk-token', async (req, res) => {
if (!req.user) return res.status(401).json({ error: 'Not authenticated' });
const now = Math.floor(Date.now() / 1000);
const token = jwt.sign({
sub: req.user.id,
email: req.user.email,
name: req.user.name,
iat: now,
exp: now + 3600, // 1 hour
customAttributes: { plan: req.user.plan }
}, process.env.FERNDESK_JWT_SECRET, { algorithm: 'HS256' });
res.send(token);
});Exemple Python :
import jwt
import time
@app.route('/api/ferndesk-token')
def ferndesk_token():
if not current_user:
return {'error': 'Not authenticated'}, 401
now = int(time.time())
token = jwt.encode({
'sub': current_user.id,
'email': current_user.email,
'name': current_user.name,
'iat': now,
'exp': now + 3600,
'customAttributes': {'plan': current_user.plan}
}, os.environ['FERNDESK_JWT_SECRET'], algorithm='HS256')
return tokenN'exposez jamais votre secret JWT dans le code côté client. Stockez-le uniquement dans des variables d'environnement côté serveur.
Appeler Identify depuis votre frontend
Récupérez le jeton depuis votre backend et transmettez-le au SDK :
Ferndesk('init', { widgetId: 'your-widget-id' });
fetch('/api/ferndesk-token').then(r => r.text())
.then(jwt => Ferndesk('identify', { jwt }))
.catch(err => console.error('Identification failed:', err));Exemple React :
useEffect(() => {
window.Ferndesk('init', { widgetId: 'your-widget-id' });
if (currentUser) {
fetch('/api/ferndesk-token')
.then(r => r.text())
.then(jwt => window.Ferndesk('identify', { jwt }));
}
}, [currentUser]);Appelez identify après l'initialisation, mais avant d'ouvrir le widget. Pour vous déconnecter, réinitialisez sans appeler identify.
Vérifier que cela fonctionne
Vérifiez ces indicateurs :
Console du navigateur : aucune erreur. Les JWT invalides affichent
Ferndesk: identify failed - invalid jwtFormulaire de contact : l'e-mail et le nom seront préremplis
Analyses : les sessions utilisateur apparaissent dans votre tableau de bord
Erreurs courantes
Ferndesk: identify requires a jwt
Paramètre jwt manquant. Vérifiez que votre backend renvoie bien une chaîne JWT.
invalid jwt
La vérification de la signature ou la validation du claim a échoué. Vérifiez :
Le secret JWT correct correspond à celui stocké dans Ferndesk
Le jeton n'a pas expiré
L'algorithme est HS256
Les claims requis sont présents :
sub,email,expetiat
Le subject JWT ne correspond pas à l'utilisateur existant du centre d'aide
Cette erreur se produit lorsqu'un e-mail d'utilisateur existe déjà dans votre centre d'aide, mais avec un ID de subject différent. Cela signifie que quelqu'un s'est déjà connecté avec cette adresse e-mail à l'aide d'un autre système d'identité ou d'une autre valeur sub.
Pour résoudre le problème :
Assurez-vous que votre backend envoie toujours le même
subpour chaque utilisateurSi vous avez changé de système d'ID utilisateur, l'utilisateur concerné devra être reprovisionné dans Ferndesk
doit être appelé depuis le même domaine ou un sous-domaine de niveau 1
Incompatibilité de domaine. Votre application et votre centre d'aide doivent partager un domaine racine.
Le claim sub est l'identifiant principal des utilisateurs. Bien que email soit requis, Ferndesk lie l'identité au subject, et non à la seule adresse e-mail. Cela évite la prise de contrôle de compte si les adresses e-mail changent ou sont réutilisées.
Notes de sécurité
Définissez l'expiration du jeton (1 heure est courant)
Générez des jetons uniquement pour les utilisateurs authentifiés
Utilisez HTTPS partout
Ne committez jamais de secrets dans le contrôle de version
Conservez des valeurs
substables. Ferndesk conserve l'identité par subject.