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
- Su servidor genera un JWT y redirige al usuario a Xeni.
- Xeni extrae el token de la URL de SSO.
- Xeni envía una solicitud POST a su punto final de validación JWT con el token.
- Su punto final verifica la firma del token, verifica la caducidad y devuelve los datos del usuario.
- 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:
{
"jwtToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}| Campo | Tipo | Descripción |
|---|---|---|
jwtToken | cadena | La 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:
{
"status": true,
"msg": "User token validated",
"data": {
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"userid": "usrabc123"
}
}| Campo | Tipo | Descripción |
|---|---|---|
status | booleano | Debe ser true para una validación exitosa |
msg | cadena | Mensaje de estado legible por humanos |
data.firstname | cadena | Nombre del usuario de las reclamaciones del token |
data.lastname | cadena | Apellido del usuario de las reclamaciones del token |
data.email | cadena | Dirección de correo electrónico del usuario de las reclamaciones del token |
data.user_id | cadena | Identificador ú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:
{
"status": false,
"msg": "Invalid or expired token",
"data": null
}| Campo | Tipo | Descripción |
|---|---|---|
status | booleano | Debe ser false para una validación fallida |
msg | cadena | Mensaje de error legible por humanos |
data | nulo | Debe ser null cuando falla la validación |
Ejemplo de implementación
Node.js (Rápido)
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)
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:
- El token está presente: el campo
jwtTokenexiste y no está vacío. - La firma es válida: el token se firmó con el secreto compartido correcto mediante HS256.
- El token no ha caducado: el reclamo
expes en el futuro. - Las reclamaciones obligatorias están presentes: el token contiene
userid,email,firstnameylast_name. - El emisor es correcto: opcionalmente, verifique que el reclamo
isscoincida 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.