Registro de usuarios externo a phpBB 3.x

Reading time ~9 minutes

Nota: Si lo que buscas es integrar phpBB 3.x con CakePHP, ésta es tu entrada.

El otro día expliqué cómo registrar usuarios en nuestro Wordpress desde un formulario de login externo. Como ya expliqué he estado haciendo un formulario de registro global para varios scripts para mi página web (Wordpress, phpBB, MediaWiki) y quiero poder aliviaros esfuerzo si llegado el caso tenéis que hacerlo ;)

Al igual que con el anterior tutorial voy a dar por hecho que sabéis hacer un formulario y enviar y recibir datos vía GET y POST. Así pues, ¡vayamos al grano!

Primero de todo cargamos ficheros necesarios e inicializamos la constante “IN_PHPBB”:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Iniciamos la constante IN_PHPBB
define('IN_PHPBB', true);
// Indicamos la carpeta donde se encuentra nuestro phpBB3
$phpbb_root_path = '../forums/';
// Extension de los ficheros a cargar
$phpEx = substr(strrchr(__FILE__, '.'), 1);
// Cargamos fichero common.php
require_once($phpbb_root_path . 'common.' . $phpEx);
// Cargamos fichero functions_user.php (éste es el que contiene
// las funciones para añadir usuarios)
require_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
// Definimos la diferencia horaria con el servidor (explicado más adelante)
define ('UTC',1);

Ya tenemos lo más importante. Ahora pasaremos a hacer un par de comprobaciones: validar la existencia del usuario y verificar el e-mail. Ambas verificaciones serán llevadas a cabo con funciones de phpBB (cargadas en las líneas anteriores).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Variables recogidas del formulario
$nick = $_POST['nombre_de_usuario'];
$email = $_POST['email'];
$pass = $_POST['contrasenya'];
$error = false;
// Comprobamos si el nombre de usuario existe
if (validate_username($nick)) {
    echo 'El nombre de usuario especificado ya existe';
    $error = true;
}
// Comprovamos el e-mail
if (validate_email($email)) {
    switch(validate_email($email)) {
        case DOMAIN_NO_MX_RECORD:
            echo 'El dominio de la cuenta e-mail especificada no existe';
            break;
        case EMAIL_TAKEN:
            echo 'Existe un usuario registrado con el mismo e-mail';
            break;
        case EMAIL_INVALID:
            echo 'El e-mail especificado no es válido';
            break;
    }
    $error = true;
}
// En caso de error ejecutamos el código que queramos
if ($error) {
    // En mi caso vuelvo a mostrar el formulario de registro
    $form->display();
    // y finalizo la ejecución
    exit;
}

La función validate_username retorna una cadena si el nombre de usuario ya existe o false en caso de que no exista. Lo que no he logrado averiguar es si hay distintas frases o solo una “USERNAME_TAKEN” (si alguien sabe de alguna otra le agradeceré que me lo indique), por eso mismo lo trato como true o false.

Por otro lado, la función validate_email retorna tres cadenas distintas, según si el dominio o el e-mail son válidos o si el e-mail está cogido.

Pasemos al propio registro del usuario. Antes de hacerlo debéis saber que os mostraré cómo hacer para registrar a un usuario inactivo. Si queréis registrar al usuario activado directamente, simplemente omitid las líneas que os indique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Encriptamos la contraseña
$hash = phpbb_hash($pass);
// Generamos un código de activación para la cuenta
$actkey = substr(md5(time()), 0, 13);
// Añadimos los datos de usuario en una tabla
$dades_forum = array('username'=>$nick, // Nombre de usuario
    'user_password'        => $hash, // Contraseña encriptada
    'group_id'             => 5, // Grupo al que pertenece
    'user_email'           => $email,
    'user_type'            => 1, //** Tipo de usuario
    'user_actkey'          => $actkey, //** Clave de activación de cuenta
    'user_lang'            => 'ca', // Idioma (catalán en este caso)
    'user_timezone'        => $utc, // Diferencia horaria del cliente
    'user_inactive_reason' => 1, // Motivo por el cual su cuenta está inactiva
    'user_inactive_time'   => time() - UTC * 3600, //** Hora en que se 'inactiva' su cuenta
    'user_regdate'         => time() - UTC * 3600); // Hora de registro (menos la diferencia horaria con el servidor)
// Añadimos el usuario
if (!$user_id = user_add($dades_forum)) {
  die('Error inesperado al registrarte');
}
echo 'Usuario registrado correctamente! Tu ID de usuario es ' . $user_id . ' y tu clave de activación ' . $actkey;

Las líneas comentadas con dos asteriscos (//**) son aquellas que se descartan o varían cuando queremos registrar un usuario con la cuenta ya activa (explicado más adelante).

Ahora, por pasos:

  • Encriptamos la contraseña utilizando la función phpbb_hash. Este paso puede ser modificado por una simple encriptación por MD5 ya que phpbb reconoce ambos métodos de encriptación a la hora de logear usuarios.
  • Generamos un código de 13 caracteres a partir de la hora actual encriptada en md5 (esto es para conseguir una clave lo más aleatoria posible) y añadimos los datos en una tabla asociativa.
  • Añadimos todos los datos en una tabla asociativa.
  • En caso de querer registrar el usuario con su cuenta ya activa, descartaríamos las claves (y sus respectivos valores) "user_actkey" y "user_inactive_time" y la clave "user_type" la pondríamos a 0 en lugar de 1 (1 es usuarios inactivos, 2 BOTs y 0 usuarios activos).
  • UTC indica la diferencia horaria con el servidor. Es una constante que he iniciado en las primeras líneas de código y cuya función no es más que restar la diferencia horaria entre el servidor y UTC+0 (phpBB guarda las horas en UTCzero). En mi caso la diferencia horaria es +1, pues el ordenador en el que hago estos códigos es el mío y así que está en UTC+1. Si el servidor estuviera en U.S.A. quizás debierais poner -7 o -8 (como he dicho dependerá de la situación horaria de vuestro servidor...).
  • Para terminar, la función user_add devuelve la nueva ID del usuario creado. Con ella y con la clave de activación guardada anteriormente podemos crear un enlace de activación:
1
2
<?php
echo '<a href="../forums/ucp.php?mode=activate&amp;u=' . $user_id . '&amp;k=' . $actkey . '">Haz clic aquí para activar tu cuenta</a>';

Una vez terminado el registro podemos enviar este enlace al usuario vía e-mail para que active su cuenta.

Página de referencia: