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 Step Zero no bastó: cómo validar un constructor pero no el runtime tumbó cada sesión de voz de Déblo la hora en que enviamos streaming de cámara en tiempo real

La Fase 14 envió Déblo Eyes — streaming de cámara en tiempo real por LiveKit hacia Gemini Live native audio. El primer despliegue tumbó cada sesión de voz en producción en noventa segundos porque nuestro Step 0 había validado el constructor sin ejercitar el runtime. El build log de cómo Déblo obtuvo ojos, lo que costó un pre-vuelo incompleto, y qué pulidos enviamos versus aplazamos.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

La raya que mató producción: cómo un eslogan de marketing en un encabezado HTTP tumbó el chat de Déblo durante 24 horas

Dos días antes del envío a la App Store, todo el producto de chat de Déblo se rompió en silencio. Sin spinner, sin toast, sin error en la UI — solo aire muerto. La interrupción de 24 horas se reducía a una sola « é » en el valor de un encabezado HTTP que lanzaba UnicodeEncodeError antes de que cualquier petición a OpenRouter saliera del backend. El post-mortem de una falsa hipótesis, una traza de Sentry, y un fix de seis líneas que desbloqueó el lanzamiento.

29 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Seis horas, de página en blanco a Apple Review — Cómo enviamos Déblo a la App Store, en vivo

Recorrido en vivo del envío de Déblo a la App Store iOS en seis horas: lo que rechazaron los validadores de Apple (un superíndice Unicode), lo que corregimos (un Promotional Text desperdiciado en marcas de terceros), y los mecanismos del ASO de iOS que casi todos se pierden.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16