Autenticación JWT
Identifica a los usuarios en tu widget de ayuda sin necesidad de un inicio de sesión por separado. Cuando los usuarios han iniciado sesión en tu aplicación, puedes pasar su identidad a Ferndesk utilizando un token JWT firmado por tu backend.
Necesitarás tu secreto JWT de Centro de Ayuda > Personalizar > Control de acceso y tener instalado el SDK de Ferndesk.
Cómo funciona
Flujo de tres pasos:
Tu frontend detecta a un usuario con sesión iniciada
Tu backend genera un JWT firmado con los detalles del usuario
Tu frontend llama a
Ferndesk('identify', { jwt })
El centro de ayuda y el widget ahora saben quién es el usuario para fines de autenticación, personalización y analíticas.
El método identify solo funciona desde el mismo dominio que tu centro de ayuda o un subdominio de primer nivel. Si tu centro de ayuda está en help.example.com, puedes identificar desde app.example.com pero no desde otrodominio.com.
Secreto JWT
Antes de poder firmar JWTs, necesitas un secreto de firma desde tu panel de Ferndesk:
Ve a Centro de Ayuda, luego, en Administrar, haz clic en Control de acceso.
Despliega la fila Identificación JWT
Haz clic en Generar secreto
Solo puedes crear un secreto JWT por centro de ayuda. Si ya existe un secreto, deberás eliminarlo antes de generar uno nuevo.
El secreto se muestra solo una vez cuando lo generas. Cópialo de inmediato y almacénalo de forma segura en las variables de entorno de tu backend. No podrás volver a verlo.
Si pierdes tu secreto, tendrás que eliminarlo y generar uno nuevo. Esto invalidará todos los tokens JWT existentes firmados con el secreto anterior hasta que actualices tu backend para usar el nuevo.
Generar el JWT en el servidor
Crea un endpoint que devuelva un token firmado. Claims requeridos:
sub(string, requerido): ID único en tu sistema que identifica a este usuario. Esta es la clave de identidad principal.email(string, requerido): Correo electrónico del usuarioname(string, opcional): Nombre a mostrarcustomAttributes(object, opcional): Metadatos adicionalesexp(number, recomendado): Marca de tiempo de expiración del token
El claim sub debe permanecer estable para cada usuario. Ferndesk utiliza este asunto para identificar y vincular usuarios. Si el sub de un usuario cambia, no se vinculará a su identidad anterior del centro de ayuda.
Ejemplo de 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 token = jwt.sign({
sub: req.user.id,
email: req.user.email,
name: req.user.name,
exp: Math.floor(Date.now() / 1000) + 3600 // 1 hour
}, process.env.FERNDESK_JWT_SECRET, { algorithm: 'HS256' });
res.send(token);
});Ejemplo de Python:
import jwt
import time
@app.route('/api/ferndesk-token')
def ferndesk_token():
if not current_user:
return {'error': 'Not authenticated'}, 401
token = jwt.encode({
'sub': current_user.id,
'email': current_user.email,
'name': current_user.name,
'exp': int(time.time()) + 3600
}, os.environ['FERNDESK_JWT_SECRET'], algorithm='HS256')
return tokenNunca expongas tu secreto JWT en el código del lado del cliente. Almacénalo en variables de entorno únicamente en el lado del servidor.
Llamar a Identify desde tu Frontend
Obtén el token de tu backend y pásalo al 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));Ejemplo de 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]);Llama a identify después de init pero antes de abrir el widget. Para cerrar sesión, vuelve a inicializar sin llamar a identify.
Verificar que funciona
Revisa estos indicadores:
Consola del navegador: Sin errores. Los JWT inválidos muestran
Ferndesk: identify failed - invalid jwtFormulario de contacto: El correo electrónico y el nombre se rellenarán automáticamente
Analíticas: Las sesiones de usuario aparecen en tu panel de control
Errores comunes
Ferndesk: identify requires a jwt
Falta el parámetro jwt. Comprueba que tu backend esté devolviendo una cadena JWT.
invalid jwt
La verificación de la firma falló. Verifica:
Que el secreto JWT correcto coincida con el almacenado en Ferndesk
Que el token no haya expirado
Que el algoritmo sea HS256
JWT subject does not match the existing help-center user
Este error ocurre cuando el correo electrónico de un usuario ya existe en tu centro de ayuda pero con un ID de asunto diferente. Esto significa que alguien inició sesión anteriormente con ese correo utilizando un sistema de identidad o un valor de sub diferente.
Para resolverlo:
Asegúrate de que tu backend envíe siempre el mismo
subpara cada usuarioSi has cambiado los sistemas de ID de usuario, el usuario afectado deberá ser reaprovisionado en Ferndesk
must be called from same domain or 1-level subdomain
Discrepancia de dominio. Tu aplicación y tu centro de ayuda deben compartir un dominio raíz.
El claim sub es el identificador principal de los usuarios. Aunque el email es obligatorio, Ferndesk vincula la identidad al asunto, no solo a la dirección de correo electrónico. Esto evita la apropiación de cuentas si las direcciones de correo cambian o se reutilizan.
Notas de seguridad
Establece la expiración del token (1 hora es lo habitual)
Solo genera tokens para usuarios autenticados
Usa HTTPS en todas partes
Nunca subas secretos al control de versiones
Mantén estables tus valores de
sub: Ferndesk conserva la identidad por asunto