Cómo crear un punto final de validación JWT

Última actualización: 2026-03-03

Cómo crear un punto final de validación JWT

Cuando un usuario es redirigido a Xeni Quick Builder con un token JWT, Xeni llama a su punto final de validación para confirmar que el token es auténtico y recuperar la identidad del usuario. Este artículo explica cómo construir ese punto final.

Cómo funciona

  1. Su servidor genera un JWT y redirige al usuario a Xeni.
  2. Xeni extrae el token de la URL de SSO.
  3. Xeni envía una solicitud POST a su punto final de validación JWT con el token.
  4. Su punto final verifica la firma del token, verifica la caducidad y devuelve los datos del usuario.
  5. Si la validación tiene éxito, el usuario inicia sesión en Quick Builder.

Especificación de punto final

Su punto final debe aceptar la siguiente solicitud y devolver la respuesta adecuada.

URL

POST /api/jwt-validation/validate

Usted elige la URL completa (por ejemplo, https://api.yourplatform.com/api/jwt-validation/validate). Esta URL está registrada en el panel de administración de Xeni.

Solicitud

Xeni envía una solicitud POST con cuerpo JSON:

JSON
{
  "jwtToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
CampoTipoDescripción
jwtTokencadenaLa cadena de token JWT completa que se pasó en la URL de redireccionamiento de SSO

Respuesta exitosa (200)

Cuando el token sea válido y no haya caducado, devuelva HTTP 200 con el siguiente cuerpo:

JSON
{
  "status": true,
  "msg": "User token validated",
  "data": {
    "first_name": "Jane",
    "last_name": "Doe",
    "email": "jane.doe@example.com",
    "userid": "usrabc123"
  }
}
CampoTipoDescripción
statusbooleanoDebe ser true para una validación exitosa
msgcadenaMensaje de estado legible por humanos
data.firstnamecadenaNombre del usuario de las reclamaciones del token
data.lastnamecadenaApellido del usuario de las reclamaciones del token
data.emailcadenaDirección de correo electrónico del usuario de las reclamaciones del token
data.user_idcadenaIdentificador único del usuario de las reclamaciones del token

Respuesta de error (401)

Cuando el token no es válido, ha caducado o no se puede verificar, devuelva HTTP 401:

JSON
{
  "status": false,
  "msg": "Invalid or expired token",
  "data": null
}
CampoTipoDescripción
statusbooleanoDebe ser false para una validación fallida
msgcadenaMensaje de error legible por humanos
datanuloDebe ser null cuando falla la validación

Ejemplo de implementación

Node.js (Rápido)

JAVASCRIPT
const express = require('express');
const jwt = require('jsonwebtoken');

const SECRETKEY = process.env.JWTSECRET; // 32+ character secret
const app = express();
app.use(express.json());

app.post('/api/jwt-validation/validate', (req, res) => {
const { jwtToken } = req.body;

if (!jwtToken) {
return res.status(401).json({
status: false,
msg: 'No token provided',
data: null
});
}

try {
const decoded = jwt.verify(jwtToken, SECRET_KEY, {
algorithms: ['HS256']
});

return res.status(200).json({
status: true,
msg: 'User token validated',
data: {
firstname: decoded.firstname,
lastname: decoded.lastname,
email: decoded.email,
userid: decoded.userid
}
});
} catch (error) {
let message = 'Invalid or expired token';
if (error.name === 'TokenExpiredError') {
message = 'Token has expired';
} else if (error.name === 'JsonWebTokenError') {
message = 'Invalid token signature';
}

return res.status(401).json({
status: false,
msg: message,
data: null
});
}
});

Python (frasco)

PYTHON
from flask import Flask, request, jsonify
import jwt
import os

app = Flask(name)
SECRETKEY = os.environ.get('JWTSECRET') # 32+ character secret

@app.route('/api/jwt-validation/validate', methods=['POST'])
def validate_jwt():
body = request.get_json()
token = body.get('jwtToken') if body else None

if not token:
return jsonify({
'status': False,
'msg': 'No token provided',
'data': None
}), 401

try:
decoded = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
return jsonify({
'status': True,
'msg': 'User token validated',
'data': {
'firstname': decoded['firstname'],
'lastname': decoded['lastname'],
'email': decoded['email'],
'userid': decoded['userid']
}
}), 200
except jwt.ExpiredSignatureError:
return jsonify({
'status': False,
'msg': 'Token has expired',
'data': None
}), 401
except jwt.InvalidTokenError:
return jsonify({
'status': False,
'msg': 'Invalid token signature',
'data': None
}), 401

Lista de verificación de validación

Su punto final debe verificar lo siguiente antes de devolver una respuesta exitosa:

  1. El token está presente: el campo jwtToken existe y no está vacío.
  2. La firma es válida: el token se firmó con el secreto compartido correcto mediante HS256.
  3. El token no ha caducado: el reclamo exp es en el futuro.
  4. Las reclamaciones obligatorias están presentes: el token contiene userid, email, firstname y last_name.
  5. El emisor es correcto: opcionalmente, verifique que el reclamo iss coincida con el emisor esperado.

Consideraciones de seguridad


  • Usar HTTPS: su punto final de validación debe entregarse a través de HTTPS. Xeni no llamará a los puntos finales HTTP.
  • Límite de velocidad del punto final: protege contra intentos de fuerza bruta limitando las solicitudes por IP o por token.
  • Fallos de validación de registros: registre los intentos de validación fallidos para el monitoreo de seguridad.
  • No exponer errores internos: devuelve mensajes de error genéricos a la persona que llama. Registre errores detallados internamente.

Próximos pasos

Una vez que su punto final de validación esté activo y accesible, configúrelo en el panel de administración de Xeni para que Quick Builder sepa dónde enviar las solicitudes de verificación de tokens.

¿Te resultó útil este artículo?