Phpost

Versión completa: Doble Factor de Autenticación (2FA) v1.0
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Doble Factor de Autenticación (2FA) v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 


Cada usuario puede activar el 2FA desde su cuenta. Al iniciar sesión, si las credenciales son correctas, se le pide un código de 6 dígitos enviado a su email antes de entrar.


🛡️ Características
 
  • Código de 6 dígitos criptográficamente seguro
  • Expira en 5 minutos
  • Solo se puede usar una vez
  • Máximo 3 intentos fallidos antes de invalidar
  • Reenvío con límite de 60 segundos
  • Cada usuario activa/desactiva desde su cuenta
  • Email con diseño moderno
  • Compatible con el mod de Protección de Login
 


📋 Requisitos
 
  • Risus Nova 2.0 instalado y funcionando
  • PHP 8.0+
  • Correo mail() configurado en el servidor
 


🛠️ Instalación

Paso 1 — Ejecutar el instalador

Sube la carpeta install/ a la raíz y accede a:

 
Código:
Registrate o inicia tu sesión para ver este contenido

⚠️ Elimina la carpeta install/ cuando termine.

Paso 2 — Subir los archivos
 
Código:
inc/class/c.2fa.php                      →  inc/class/
inc/php/2fa.php                          →  inc/php/
inc/php/ajax/ajax.2fa.php               →  inc/php/ajax/
themes/default/templates/t.2fa.tpl     →  themes/default/templates/

Paso 3 — En ajax.login.php

Dentro del case 'login-user', donde se llama a loginUser, buscar:
Código PHP:
if(empty($user) or empty($pass)) echo '0: Faltan datos';
else echo 
$tsUser->loginUser($user$pass$reme); 


Reemplazar por:
 
Código:
if(empty($user) or empty($pass)) {
    echo '0: Faltan datos';
} else {
    $resultado = $tsUser->loginUser($user, $pass, $reme);

    if ($resultado === TRUE || is_numeric($resultado)) {
        // ── 2FA ──
        require_once TS_CLASS . 'c.2fa.php';
        $ts2FA = new ts2FA();
        if ($ts2FA->tieneActivo($tsUser->uid)) {
            $tsUser->logoutUser($tsUser->uid, null);
            $_SESSION['ts_2fa_pending']  = $tsUser->uid;
            $_SESSION['ts_2fa_remember'] = $reme;
            $ts2FA->enviarCodigo($tsUser->uid);
            echo '3: ' . $tsCore->settings['url'] . '/2fa/';
            break;
        }
        // ────────
        echo $resultado;
    } else {
        echo $resultado;
    }
}

Paso 4 — En m.cuenta_cuenta.tpl

Buscar:
Código PHP:
<div class="buttons">
<
input type="button" value="Guardar" onclick="cuenta.save(1)" class="mBtn btnOk">
<
input type="button" value="Siguiente" onclick="cuenta.save(1, true)" class="mBtn btnOk">
</
div


Arriba agregar:
 
Código:
<div class="field">
    <label>Verificación en dos pasos (2FA):</label>
    <div style="padding:10px; background:#f8f9fa; border-radius:6px; border:1px solid #eee;">
        <label style="display:flex; align-items:center; gap:10px; cursor:pointer;">
            <input type="checkbox" name="2fa"
                   {if $tsUser->info.user_2fa}checked{/if}
                   onchange="cuenta.toggle2FA(this.checked)"/>
            <span>
                <strong>Activar 2FA</strong><br>
                <small style="color:#888; font-weight:400;">Al iniciar sesión se te pedirá un código enviado a tu email.</small>
            </span>
        </label>
    </div>
</div>

Y en cuenta.js buscar:
Código PHP:
}

}

var 
avatar = { 


Reemplazar por:
 
Código:
},

    toggle2FA: function(activo) {
        $.ajax({
            type: 'POST',
            url: global_data.url + '/2fa-toggle.php',
            data: { activo: activo ? 1 : 0 },
            dataType: 'json',
            success: function(r) {
                if (r.ok) {
                    cuenta.alert(1, activo ? '2FA activado' : '2FA desactivado', activo ? 'Ahora se pedirá un código al iniciar sesión.' : 'La verificación en dos pasos ha sido desactivada.');
                }
            }
        });
    }

}

var avatar = {

Paso 5 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


🗑️ Desinstalar
 
Código:
ALTER TABLE u_miembros DROP COLUMN user_2fa;
DROP TABLE IF EXISTS w_2fa_tokens;

Elimina los archivos y quita el hook de ajax.login.php.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido

Google Drive
http://Registrate o inicia tu sesión par... contenido



¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.