Autenticación JWT
Identifica a los usuarios en tu widget de ayuda sin necesidad de un inicio de sesión aparte. Cuando los usuarios hayan iniciado sesión en tu app, puedes transmitir su identidad a Ferndesk mediante un token JWT firmado por tu backend.
Necesitarás tu secreto JWT de Help Center > Access Control y tener instalado el SDK de Ferndesk.
JWT identify está disponible en todos los planes y funciona tanto en los modos de acceso Open como Locked. No necesitas bloquear tu centro de ayuda ni hacer una actualización para generar un secreto.
Cómo funciona
Flujo de tres pasos:
Tu frontend detecta a un usuario que ha iniciado sesión
Tu backend genera un JWT firmado con los datos del usuario
Tu frontend llama a
Ferndesk('identify', { jwt })
Ahora el centro de ayuda y el widget saben quién es el usuario para 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 1 nivel. Si tu centro de ayuda está en help.example.com, puedes identificar desde app.example.com, pero no desde otherdomain.com.
Secreto JWT
Antes de poder firmar JWT, necesitas un secreto de firma de tu panel de Ferndesk:
Ve a Help Center > Access Control.
En la sección User identification, despliega la fila JWT identify.
Haz clic en Generate Secret.
Generar un secreto habilita automáticamente la autenticación JWT para tu centro de ayuda. El secreto se muestra solo una vez. Cópialo de inmediato y guárdalo de forma segura en las variables de entorno de tu backend. No podrás volver a verlo.
Si necesitas rotar el secreto, haz clic en Regenerate. Esto reemplaza el secreto existente e invalida todos los tokens firmados con el anterior. Actualiza tu backend con el nuevo secreto antes de que los usuarios se vean afectados.
Solo puedes tener un secreto JWT por centro de ayuda. Generate Secret solo está disponible cuando no existe ningún secreto. Regenerate está disponible cuando ya existe un secreto.
Inicio de sesión en el navegador para clientes MCP e IA
JWT identify funciona de forma silenciosa en tu producto. Los clientes de IA inician sesión a los usuarios a través de un navegador.
En JWT identify dentro de Browser sign-in (MCP and AI clients):
Introduce la URL de tu SSO login page URL. Ferndesk redirige a los usuarios aquí con un parámetro
return_to. Después de iniciar sesión, redirige areturn_tocon un parámetro de consultajwt.Opcionalmente, activa Allow email sign-in for AI clients para que los usuarios existentes puedan demostrar la propiedad del correo electrónico al conectar un cliente de IA. Déjalo desactivado si los atributos de usuario controlan contenido sensible.
Haz clic en Save changes.
Usa una URL válida http: o https:. Los valores inválidos muestran Introduce una URL de página de inicio de sesión válida, incluido https://.
Relacionado: Usa Ferndesk con herramientas de IA · Permite que los lectores usen tu centro de ayuda en herramientas de IA
Genera el JWT del lado del servidor
Crea un endpoint que devuelva un token firmado. Ferndesk no requiere claims iss (issuer) ni aud (audience).
Claims obligatorios:
sub(string, required): ID único en tu sistema que identifica a este usuario. Esta es la clave principal de identidad.email(string, required): Dirección de correo electrónico del usuarioexp(number, required): Marca de tiempo de caducidad del tokeniat(number, required): Marca de tiempo de emisión del token
Claims opcionales:
name(string, optional): Nombre para mostrarcustomAttributes(object, optional): Atributos adicionales del usuario. También puedes usarmetadata; se aceptan ambas claves.
El claim sub debe permanecer estable para cada usuario. Ferndesk usa este subject para identificar y vincular usuarios. Si el sub de un usuario cambia, no se vinculará con su identidad anterior del centro de ayuda.
Ejemplo en 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);
});Ejemplo en 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 tokenNunca expongas tu secreto JWT en código del lado del cliente. Guárdalo solo en variables de entorno del lado del servidor.
Llama 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 en 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.
Verifica que funcione
Comprueba estos indicadores:
Consola del navegador: No hay errores. Los JWT inválidos muestran
Ferndesk: identify failed - invalid jwtFormulario de contacto: El correo electrónico y el nombre se completarán automáticamente
Analíticas: Las sesiones de usuario aparecen en tu panel
Errores comunes
Ferndesk: identify requires a jwt
Falta el parámetro jwt. Comprueba que tu backend esté devolviendo una cadena JWT.
invalid jwt
Falló la verificación de la firma o la validación de claims. Verifica:
El secreto JWT correcto coincide con lo almacenado en Ferndesk
El token no ha caducado
El algoritmo es HS256
Están presentes los claims obligatorios:
sub,email,expeiat
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 subject diferente. Esto significa que alguien inició sesión previamente con ese correo usando otro sistema de identidad o valor sub.
Para resolverlo:
Asegúrate de que tu backend siempre envíe el mismo
subpara cada usuarioSi has cambiado los sistemas de ID de usuario, será necesario volver a aprovisionar al usuario afectado en Ferndesk
must be called from same domain or 1-level subdomain
Discordancia de dominio. Tu app y tu centro de ayuda deben compartir un dominio raíz.
El claim sub es el identificador principal de los usuarios. Aunque email es obligatorio, Ferndesk vincula la identidad al subject, no solo a la dirección de correo. Esto evita la apropiación de cuentas si las direcciones de correo cambian o se reutilizan.
Notas de seguridad
Establece la caducidad del token (1 hora es lo habitual)
Genera tokens solo para usuarios autenticados
Usa HTTPS en todas partes
Nunca confirmes secretos en el control de versiones
Mantén estables tus valores
sub. Ferndesk conserva la identidad por subject.