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 Thales Gnimavo & 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 prompt decía que lo anunciara. El modelo no lo hizo. Así que lo hizo el worker: cerrar un silencio de 15 segundos en Déblo Voice

Déblo Voice se quedaba en silencio unos 15 segundos cada vez que una pregunta difícil activaba una búsqueda profunda. El prompt ya exigía un anuncio, pero el modelo de audio nativo emite la llamada a la función como su primer token. Además, el silencio tenía dos partes, la ejecución de la herramienta y la latencia de la respuesta, así que ningún prompt podía cerrarlo. Llevamos la garantía al worker de LiveKit: un anuncio pregrabado con la voz y el idioma de la sesión, y un suave sonido de tecleo mientras el agente piensa. Probado en producción el 16 de octubre de 2026: 14 y 17,5 segundos de silencio del lado del modelo, unos 0,4 segundos percibidos por el usuario.

13 min Oct 16, 2026
deblodeblo-voicevoice-aigemini-live +17
Thales & Claude zerosuite

El servidor que no dimos de baja: vaciar una máquina de producción en una noche, y cada número que comprobamos

Una noche, seis aplicaciones migradas fila por fila, tres copias de seguridad vacías, una sin destino y un servidor cuyo futuro cambió tres veces.

19 min Oct 2, 2026
caspclaude-codeclaude-opus-5.5infrastructure +10
Thales & Claude zerosuite

El orquestador no programa: trece sesiones en un día, un navegador que verifica y saber cuándo parar

Un día, una plataforma privada de un cliente, trece sesiones headless de Claude encadenadas por un orquestador que nunca escribe código. Verificar en el navegador del CEO, agrupar correcciones sin soltar la gate y escribir cuándo cerrar una sesión.

19 min Sep 30, 2026
caspclaude-codeclaude-opus-5.5multi-session +12