Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Sistema de login externo a tu foro SMF 2.1.6+

Iniciado por Swarlog, Oct 20, 2025, 04:01 PM

Tema anterior - Siguiente tema

Swarlog

Más de un usuario por privado me lo ha pedido, ya que es un comedero de cabeza... usa un sistema de protección de contraseñas muy trivial y si no tienes acceso a los archivos del foro, es complicado.

En este caso, el panel usa el foro de referencia. Por lo que la web en donde queremos sincronizar los usuarios con respecto al foro, ha de estar en el mismo servidor web o al menos con acceso a sus archivos.

Este es el panel de ejemplo:


<?php
/**
 * login_smf_external.php
 * ----------------------------------------------------
 * Login externo para verificar usuarios de SMF 2.1.6
 * utilizando el motor de autenticación nativo de SMF.
 *
 * Creditos: @Swarlog , para la comunidad U3Games
 * Requiere acceso al foro SMF (SSI.php)
 * ----------------------------------------------------
 */

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Ruta al foro SMF
$forum_path = '/var/www/TuWeB/foro'; // ruta del foro
require_once($forum_path . '/SSI.php'); // carga entorno del foro
require_once($sourcedir . '/Subs-Auth.php'); // funciones de autenticación del foro

// -------------------------------------------------------------
// Mostrar formulario simple si no hay POST
// -------------------------------------------------------------
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo <<<HTML
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Login SMF Externo</title>
        <style>
            body { font-family: Arial, sans-serif; background: #111; color: #eee; display: flex; align-items: center; justify-content: center; height: 100vh; }
            form { background: #222; padding: 30px; border-radius: 10px; width: 350px; box-shadow: 0 0 15px #000; }
            input { width: 100%; padding: 10px; margin: 10px 0; border: none; border-radius: 5px; }
            input[type="text"], input[type="password"] { background: #333; color: #fff; }
            input[type="submit"] { background: #007bff; color: #fff; cursor: pointer; font-weight: bold; }
            input[type="submit"]:hover { background: #0056b3; }
        </style>
    </head>
    <body>
        <form method="POST">
            <h2>Iniciar sesión con SMF</h2>
            <label>Usuario o email:</label>
            <input type="text" name="user" required>
            <label>Contraseña:</label>
            <input type="password" name="pass" required>
            <input type="submit" value="Entrar">
        </form>
    </body>
    </html>
    HTML;
    exit;
}

// -------------------------------------------------------------
// Procesar login (POST)
// -------------------------------------------------------------

$user = trim($_POST['user'] ?? '');
$pass = $_POST['pass'] ?? '';

if ($user === '' || $pass === '')
{
    die('Faltan datos.');
}

global $smcFunc, $db_prefix, $sourcedir;

// Buscar usuario por nombre o correo
$request = $smcFunc['db_query']('', '
    SELECT id_member, member_name, real_name, email_address, passwd
    FROM {db_prefix}members
    WHERE LOWER(member_name) = LOWER({string:user}) OR LOWER(email_address) = LOWER({string:user})
    LIMIT 1',
    ['user' => $user]
);

if ($smcFunc['db_num_rows']($request) === 0)
{
    die('Usuario no encontrado.');
}

$member = $smcFunc['db_fetch_assoc']($request);
$smcFunc['db_free_result']($request);

// -------------------------------------------------------------
// Verificación con el método nativo de SMF
// -------------------------------------------------------------
try
{
    if (hash_verify_password($member['member_name'], $pass, $member['passwd']))
    {
        echo "<b>Inicio de sesión correcto</b><br>";
        echo "Usuario: <b>{$member['member_name']}</b><br>";
        echo "Email: {$member['email_address']}<br>";
        echo "ID: {$member['id_member']}<br>";
    }
    else
    {
        echo "Usuario o contraseña incorrectos.";
    }
}
catch (Throwable $e)
{
    echo "Error interno SMF: " . htmlspecialchars($e->getMessage());
}

?>

Guardarlo en formato *.php y probar/comentar que tal os fue.

Saludos ^^