Cómo configurar la autenticación SSO para Quick Builder
Quick Builder autentica a los usuarios a través de SSO basado en JWT. Su servidor genera un JWT firmado que contiene la identidad del usuario y luego lo redirige al motor de reservas de Xeni. Este artículo cubre cómo crear, firmar y entregar tokens JWT.
Requisitos de JWT
Todos los tokens JWT para Quick Builder deben cumplir estos requisitos:
| Requisito | Valor |
|---|---|
| Algoritmo | HS256 (HMAC con SHA-256) |
| Longitud de la clave secreta | 32 caracteres mínimo |
| Vencimiento máximo | 30 minutos desde el momento de la emisión |
Reclamaciones JWT requeridas
Cada token debe incluir los siguientes reclamos en su carga útil:
| Reclamo | Tipo | Descripción |
|---|---|---|
iss | cadena | Identificador del emisor: el dominio o nombre de su aplicación |
iat | número | Emitido en el momento como marca de tiempo Unix (segundos desde la época) |
exp | número | Tiempo de caducidad como marca de tiempo de Unix (debe ser dentro de los 30 minutos de iat) |
userid | cadena | Identificador único para el usuario en su sistema |
email | cadena | Dirección de correo electrónico del usuario |
firstname | cadena | Nombre del usuario |
last_name | cadena | Apellido del usuario |
Ejemplo de carga útil JWT
{
"iss": "partner-app.example.com",
"iat": 1740000000,
"exp": 1740001800,
"userid": "usrabc123",
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}Generando un token JWT
Ejemplo de Node.js
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your-secret-key-at-least-32-chars!'; // 32+ characters
function generateQuickBuilderToken(user) {
const payload = {
iss: 'partner-app.example.com',
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + (30 * 60), // 30 minutes
user_id: user.id,
email: user.email,
first_name: user.firstName,
last_name: user.lastName
};
return jwt.sign(payload, SECRET_KEY, { algorithm: 'HS256' });
}
Ejemplo de Python
import jwt
import time
SECRET_KEY = 'your-secret-key-at-least-32-chars!' # 32+ characters
def generatequickbuilder_token(user):
now = int(time.time())
payload = {
'iss': 'partner-app.example.com',
'iat': now,
'exp': now + (30 * 60), # 30 minutes
'user_id': user['id'],
'email': user['email'],
'firstname': user['firstname'],
'lastname': user['lastname']
}
return jwt.encode(payload, SECRET_KEY, algorithm='HS256')
Redirigir al usuario
Una vez que tenga un token firmado, redirija al usuario a la URL de SSO de Xeni:
https://your-xeni-domain.com/sso?token={JWTTOKEN}&navigateTo={ENCODEDDESTINATION}
Ejemplo de redireccionamiento (Node.js)
app.get('/launch-booking', (req, res) => {
const token = generateQuickBuilderToken(req.user);
const destination = encodeURIComponent('/hotels/search');
const ssoUrl = https://your-xeni-domain.com/sso?token=${token}&navigateTo=${destination};
res.redirect(ssoUrl);
});
Mejores prácticas de seguridad
- Nunca expongas tu clave secreta en el código del lado del cliente. La firma JWT debe realizarse en su servidor.
- Utilice una clave secreta segura con al menos 32 caracteres. Se recomienda una clave generada aleatoriamente.
- Mantenga el vencimiento breve. El máximo permitido es 30 minutos, pero valores más cortos (5-10 minutos) reducen la ventana de riesgo si se intercepta un token.
- Generar un nuevo token para cada redireccionamiento. No reutilice tokens entre sesiones.
- Almacene el secreto de forma segura utilizando variables de entorno o un administrador de secretos; nunca lo codifique en archivos fuente.
Solución de problemas
| Problema | Causa | Solución |
|---|---|---|
| Token rechazado | La clave secreta no coincide | Verificar que la clave secreta coincida con lo configurado en el panel de administración de Xeni |
| Token caducado | exp reclamo está en el pasado | Genere un token nuevo inmediatamente antes de redirigir |
| Algoritmo no válido | No utilizar HS256 | Asegúrese de que su biblioteca JWT esté configurada para usar HS256 |
| Reclamaciones faltantes | Reclamación requerida omitida | Verifique que los siete reclamos requeridos estén presentes en la carga útil |
Próximos pasos
Una vez que pueda generar tokens JWT válidos, deberá crear un punto final de validación al que Xeni llamará para verificar esos tokens.