Back to flin
flin

Autenticación OTP por WhatsApp para África

Cómo FLIN proporciona autenticación OTP por WhatsApp integrada -- el método de autenticación telefónica diseñado para mercados africanos donde WhatsApp es la plataforma principal de comunicación.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 6 min flin
EN/ FR/ ES
flinrust

En Silicon Valley, el método de autenticación predeterminado es email y contraseña, opcionalmente mejorado con Google Sign-In. Esta suposición falla espectacularmente en África, donde más de 300 millones de personas usan WhatsApp diariamente pero muchas no tienen una dirección de email personal. Un estudiante en Abidjan, un comerciante en Lagos, un profesor en Nairobi -- se comunican a través de WhatsApp, pagan a través de dinero móvil y se identifican por número de teléfono.

Construir FLIN sin autenticación por WhatsApp sería como construir un framework web americano sin Google Sign-In. Técnicamente funcionaría, pero ignoraría cómo vive realmente la audiencia objetivo.

FLIN proporciona WhatsApp OTP como método de autenticación integrado. Tres funciones -- whatsapp_send_otp(), otp_generate() y el patrón de verificación estándar -- manejan todo el flujo. Sin SDK de Twilio. Sin servicio de autenticación de terceros. Sin sorpresas de facturación por mensaje.

El flujo de autenticación WhatsApp

WhatsApp OTP usa un flujo de 3 pasos para usuarios nuevos y un flujo de 2 pasos para usuarios que regresan:

Usuario nuevo:
1. Ingresar número de teléfono -> Enviar OTP por WhatsApp
2. Ingresar código OTP -> Verificar código
3. Completar perfil (nombre, email, avatar)
4. Crear cuenta -> Panel de control

Usuario que regresa:
1. Ingresar número de teléfono -> Enviar OTP por WhatsApp
2. Ingresar código OTP -> Verificar código -> Panel de control (saltar paso 3)

La idea clave es que el número de teléfono es la identidad. Si el teléfono ya está registrado, el usuario inicia sesión después de la verificación OTP. Si no, completa un formulario de perfil y se crea una cuenta.

Paso 1: Enviar OTP

flin// app/auth/send-whatsapp-otp.flin

layout = "auth"

waPhone = session.waPhone || ""
otpSent = false

fn processSendWhatsappOtp() {
    if waPhone != "" {
        code = otp_generate(6)
        result = whatsapp_send_otp(waPhone, code)

        if result.success {
            session.waOtpCode = code
            session.waOtpPhone = waPhone
            otpSent = true
        }
    }
}
processSendWhatsappOtp()

{if otpSent}
    <h2>Enter the code sent to your WhatsApp</h2>
    <p>We sent a 6-digit code to {waPhone}</p>

    <input class="otp-input" type="text" bind={codeInput}
        maxlength="6" autocomplete="one-time-code" inputmode="numeric">

    <button click={
        session.waOtpInput = codeInput;
        location.href = "/auth/verify-whatsapp-otp"
    }>
        Verify Code
    </button>
{else}
    <p>An error occurred. Please try again.</p>
    <a href="/login">Back to login</a>
{/if}

La función otp_generate(6) crea un código de 6 dígitos criptográficamente aleatorio. La función whatsapp_send_otp() lo envía a través de la API de WhatsApp Business.

Normalización de números de teléfono

Los números de teléfono africanos vienen en muchos formatos: +225 07 08 09 10, 00225 0708091010, 07 08 09 10, 225708091010. FLIN normaliza todos estos al formato E.164 (+2250708091010) antes de enviar:

rustfn normalize_phone(phone: &str) -> String {
    // Eliminar espacios, guiones, paréntesis
    let digits: String = phone.chars()
        .filter(|c| c.is_ascii_digit() || *c == '+')
        .collect();

    if digits.starts_with('+') {
        digits
    } else if digits.starts_with("00") {
        format!("+{}", &digits[2..])
    } else if digits.len() == 10 {
        // Asumir formato local -- necesita código de país de configuración
        let country_code = env::var("DEFAULT_PHONE_COUNTRY").unwrap_or("225".into());
        format!("+{}{}", country_code, digits)
    } else {
        format!("+{}", digits)
    }
}

Por qué WhatsApp OTP para África

La decisión de integrar WhatsApp OTP en FLIN fue impulsada por la realidad del mercado:

Penetración de WhatsApp. En Costa de Marfil, Nigeria, Kenia, Ghana, Sudáfrica y la mayor parte del África subsahariana, WhatsApp es la plataforma de mensajería predeterminada. La mayoría de las personas revisan WhatsApp antes de revisar su email.

Escasez de email. Muchos usuarios de Internet africanos, especialmente fuera de las grandes ciudades, no tienen una dirección de email personal. Requerir registro por email los excluye.

Identidad telefónica primero. El dinero móvil (MTN Mobile Money, Orange Money, Wave, M-Pesa) usa números de teléfono como identificadores. Los servicios gubernamentales aceptan cada vez más la verificación por teléfono. Un número de teléfono es la forma más universal de identidad digital en África.

Costos de SMS. Los OTP basados en SMS son caros en África (0.03-0.10 USD por mensaje) y poco confiables entre operadores. Los mensajes de WhatsApp cuestan una fracción de eso a través de la API de Business y se entregan confiablemente por conexiones de datos.

Confianza. Los usuarios confían en los mensajes de WhatsApp. Un código de verificación recibido en WhatsApp se siente legítimo. Un código recibido por SMS podría parecer spam.

Al hacer de WhatsApp OTP una función integrada, FLIN se posiciona como un framework que entiende su mercado principal. Un desarrollador en Abidjan construyendo una aplicación para usuarios de África occidental puede agregar autenticación por teléfono en minutos, no en días.

Consideraciones de seguridad

WhatsApp OTP tiene consideraciones de seguridad específicas:

Expiración del código. Los códigos OTP de FLIN son válidos por 10 minutos. Después de eso, los datos de sesión se invalidan y debe solicitarse un nuevo código.

Limitación de tasa. El endpoint de envío de OTP debe limitarse para prevenir abuso. El guard guard rate_limit(3, 300) (3 solicitudes por 5 minutos) se recomienda para endpoints OTP.

Longitud del código. El código de 6 dígitos proporciona 1 millón de combinaciones posibles. Combinado con limitación de tasa (5 intentos por sesión), la fuerza bruta es impracticable.

Higiene de sesión. Los datos OTP se eliminan de la sesión inmediatamente después del uso. El código, el número de teléfono y la entrada de verificación nunca se almacenan más tiempo del necesario.

El WhatsApp OTP de FLIN no es un wrapper alrededor de un servicio de autenticación de terceros. Es un método de autenticación de primera clase integrado en el lenguaje, con la misma gestión de sesiones, validación y garantías de seguridad que la autenticación por email/contraseña.

En el próximo artículo, cubrimos los validadores de cuerpo de solicitud -- cómo los bloques validate de FLIN aplican seguridad de tipos, restricciones y reglas de negocio sobre los datos entrantes antes de que se ejecute su código de handler.


Esta es la Parte 112 de la serie "Cómo construimos FLIN", que documenta cómo un CEO en Abidjan y un CTO de IA diseñaron y construyeron un lenguaje de programación desde cero.

Navegación de la serie: - [111] OAuth2 y autenticación social - [112] Autenticación OTP por WhatsApp para África (estás aquí) - [113] Validadores de cuerpo de solicitud - [114] 75 pruebas de seguridad: cómo verificamos todo

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

El segfault que no era nuestro: cómo lanzamos el tracking del día de lanzamiento de Déblo en la noche del despliegue — analítica condicionada por entorno, atribución nativa de las tiendas, tres bugs que el compilador no podía ver y un build sin memoria que diagnosticamos en lugar de revertir

El 1 de julio de 2026 — el día del lanzamiento — el riesgo nunca fue el texto. Era que las campañas de pago salieran a ciegas. Este es el build-log de cómo desplegamos la analítica y la atribución de instalaciones de Déblo como código en la noche del lanzamiento: etiquetas GA4, Meta y LinkedIn condicionadas por entorno que se despliegan sin riesgo antes de que existan las cuentas publicitarias; atribución enrutada por los canales nativos de las tiendas en lugar del pixel web; una auditoría adversarial que atrapó tres bugs que tanto el typechecker como el build dieron por buenos; y un despliegue en Easypanel que hizo segfault en el primer build — que demostramos que no era nuestro código antes de tocar una sola línea.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26
Thales & Claude thales

Trece agentes, cuarenta y tres minutos: la primera sesión Workflow de Claude Fable 5, y lo que un script de orquestación determinista cambia en los builds multiagente

Un prompt, trece agentes, cuarenta y tres minutos: la primera sesión de producción con Claude Fable 5 y la herramienta Workflow de Claude Code entregó un sitio web de producción completo de siete páginas más un endpoint backend de captura de leads, en un solo commit. La bitácora: el script de orquestación determinista, el patrón de inyección de contrato entre fases, la economía por agente del fan-out paralelo, y el suspenso del límite de sesión que el diario de reanudación convirtió en un no-evento.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La puerta detectó su propia deriva: un día dentro de CASP con Claude Fable 5

Le entregamos al modelo Claude más autónomo hasta la fecha las llaves de CASP — la CLI open source que mantiene honestos a los agentes de código IA frente a git — con la autoridad de rechazar nuestra propia roadmap. Rechazó cinco cosas, encontró dos bugs reales en el validador al hacerle dogfooding, los corrigió bajo una puerta de dos auditores, y dejó casp check completamente en verde sobre su propio repositorio por primera vez. CASP 0.3.0 es el resultado.

15 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9