Skip to Content

SMS OTP

Auris admite contraseñas de un solo uso por SMS (OTP) en dos modos:

  • Sin contraseña: El usuario introduce su número de teléfono, recibe un código por SMS y se autentica sin contraseña
  • Autenticación de dos factores (2FA): El usuario completa el inicio de sesión con contraseña y luego recibe un código SMS como segundo factor

Ambos modos usan el mismo mecanismo subyacente — un código numérico de corta duración entregado a través de Twilio. El modo se determina por cómo se inicia el flujo.


Configuración de Twilio

Auris utiliza Twilio como proveedor de SMS. Debes tener una cuenta de Twilio con un número de teléfono o servicio de mensajería.

Crear una cuenta de Twilio

Si no tienes una, regístrate en twilio.com . Completa la verificación del número de teléfono.

Obtener credenciales

Desde el panel de la Consola de Twilio, anota tu Account SID y Auth Token.

Obtener un número de teléfono de Twilio

En Números de teléfono → Gestionar → Comprar un número, adquiere un número con capacidad SMS. Alternativamente, crea un Servicio de mensajería para mejor entregabilidad y gestión del grupo de remitentes.

Configurar en la Consola de Auris

Ve a Consola → Autenticación → SMS e introduce:

  • Account SID — desde el panel de Twilio
  • Auth Token — desde el panel de Twilio
  • Remitente — tu número de teléfono de Twilio (formato E.164, ej. +15551234567) o tu SID de Servicio de Mensajería (comienza con MG)

Guardar y probar

Haz clic en Guardar, luego usa el botón Enviar SMS de prueba para verificar la configuración con tu propio número de teléfono.

Los códigos OTP son códigos numéricos de 6 dígitos válidos por 10 minutos. El formato del código y la expiración no son configurables en la versión actual.


SMS como Inicio de Sesión sin Contraseña

En este modo, el usuario se autentica usando únicamente su número de teléfono y el código OTP — no se requiere contraseña.

Requisitos previos

  • El número de teléfono del usuario ya debe estar registrado y verificado en su cuenta. Los números de teléfono no pueden recopilarse como parte de un flujo de inicio sin contraseña.
  • El SMS sin contraseña debe estar habilitado en Consola → Autenticación → Sin contraseña → SMS OTP.

Flujo

El usuario introduce su número de teléfono

Tu aplicación recopila el número de teléfono del usuario (formato E.164) y llama al endpoint de envío de OTP.

Se envía el OTP

Auris genera un código de 6 dígitos, almacena su hash SHA-256 y lo envía a través de Twilio.

El usuario introduce el código

Tu aplicación presenta un campo para el código de 6 dígitos y lo envía al endpoint de verificación.

La autenticación está completa

Auris valida el código y emite un access token y un refresh token.

Uso de la API

POST/api/user/phone/send-otp

Envía un OTP al número de teléfono especificado para autenticación sin contraseña. Cuerpo: { phone: string } (formato E.164). Con límite de velocidad: 5 códigos por hora, 30 segundos de espera entre envíos.

POST/api/user/phone/verify-otp

Verifica el OTP y emite tokens. Cuerpo: { phone: string, code: string }. Máximo 5 intentos de verificación por código.


SMS como Autenticación de Dos Factores (2FA)

En este modo, el SMS OTP es un segundo factor. El usuario primero completa la autenticación por correo/contraseña (o social) y, si se requiere 2FA, Auris entrega un código SMS antes de emitir los tokens.

Habilitar SMS 2FA

Por usuario (autoservicio): El usuario habilita SMS 2FA desde la configuración de seguridad de su cuenta:

import { useAuris } from '@auris/react' function ConfiguracionSms2FA() { const { getAccessToken } = useAuris() const [paso, setPaso] = useState('telefono') // 'telefono' | 'verificar' | 'listo' const [telefono, setTelefono] = useState('') const [codigo, setCodigo] = useState('') async function establecerTelefono() { const token = await getAccessToken() await fetch('/api/user/phone', { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ phoneNumber: telefono }), }) setPaso('verificar') } async function verificarYHabilitar() { const token = await getAccessToken() await fetch('/api/user/phone/verify', { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ code: codigo }), }) await fetch('/api/user/2fa/sms', { method: 'POST', headers: { Authorization: `Bearer ${token}` }, }) setPaso('listo') } if (paso === 'telefono') { return ( <form onSubmit={(e) => { e.preventDefault(); establecerTelefono() }}> <input type="tel" placeholder="+15551234567" value={telefono} onChange={(e) => setTelefono(e.target.value)} /> <button type="submit">Enviar código de verificación</button> </form> ) } if (paso === 'verificar') { return ( <form onSubmit={(e) => { e.preventDefault(); verificarYHabilitar() }}> <input placeholder="Código de 6 dígitos" value={codigo} onChange={(e) => setCodigo(e.target.value)} maxLength={6} /> <button type="submit">Verificar y habilitar SMS 2FA</button> </form> ) } return <p>La autenticación de dos factores por SMS está ahora habilitada.</p> }

El Flujo de Inicio de Sesión con 2FA

Durante un inicio de sesión donde se requiere SMS 2FA, la página de inicio de sesión alojada gestiona el segundo factor automáticamente. Si implementas una interfaz de inicio de sesión personalizada usando la API directamente:

POST/api/user/2fa/sms/send

Envía un SMS OTP al número de teléfono verificado del usuario autenticado. Requiere un token de sesión parcial emitido después de la autenticación del primer factor.

POST/api/auth/verify-2fa

Envía el código 2FA. Cuerpo: { code: string, method: 'sms' }. Si tiene éxito, emite access y refresh tokens completos.


Gestión del Número de Teléfono

Los usuarios gestionan su número de teléfono desde la configuración de la cuenta. El teléfono debe estar verificado mediante OTP antes de poder usarse para la autenticación.

POST/api/user/phone

Establece o actualiza el número de teléfono del usuario autenticado. Acepta formato E.164 (ej. +15551234567). Envía un OTP de verificación inmediatamente.

POST/api/user/phone/verify

Verifica el OTP enviado al nuevo número de teléfono. Cuerpo: { code: string }. Marca el número de teléfono como verificado.

DELETE/api/user/phone

Elimina el número de teléfono de la cuenta del usuario autenticado. Deshabilita automáticamente el SMS 2FA si estaba habilitado.


Límites de Velocidad

Auris aplica límites de velocidad estrictos en los endpoints de SMS para prevenir abusos y controlar los costes de Twilio:

LímiteValor
Solicitudes OTP por teléfono por hora5
Espera entre envíos30 segundos
Intentos máximos de verificación por código5
Validez del código10 minutos

Tras 5 intentos de verificación fallidos, el código queda invalidado. El usuario debe solicitar un nuevo código.

Cuando se alcanza el límite por hora, el endpoint devuelve una respuesta 429 Too Many Requests con una cabecera Retry-After que indica cuándo se restablece el límite.


Consideraciones de Seguridad

Validación E.164 — Los números de teléfono se validan contra el formato E.164 en la entrada. Los formatos inválidos son rechazados antes de enviar cualquier SMS.

Verificación de propiedad del teléfono — Auris requiere verificación OTP antes de marcar un número de teléfono como verificado. Un número de teléfono no puede usarse para autenticación hasta que haya sido verificado.

Hash del código — Los códigos OTP se almacenan como hashes SHA-256. El código en bruto solo está presente en el mensaje SMS — nunca en la base de datos de Auris.

Riesgo de intercambio de SIM — El SMS OTP es menos resistente a los ataques de intercambio de SIM que TOTP o WebAuthn. Para aplicaciones con cuentas de alto valor, considera usar Passkeys / WebAuthn o TOTP como método 2FA.

La autenticación por SMS es vulnerable a ataques de intercambio de SIM e interceptación SS7. Para cuentas que requieren garantías de seguridad sólidas, se recomiendan las passkeys WebAuthn o las llaves de seguridad de hardware como método 2FA.


Guías Relacionadas