Inici > Programació, Web > Registro de usuarios externo a phpBB 3.x

Registro de usuarios externo a phpBB 3.x

dimecres, 21 de gener de 2009 Imprimir

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”:

// 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).

// 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<br />";
			break;
		case EMAIL_TAKEN:
			echo "Existe un usuario registrado con el mismo e-mail<br />";
			break;
		case EMAIL_INVALID:
			echo "El e-mail especificado no es válido<br />";
			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.

// 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:
<?php
echo "<a href='../forums/ucp.php?mode=activate&u=" . $user_id . "&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:

  1. Leonardo
    dimecres, 18 de febrer de 2009 a les 18:57 | #1

    Muchas Gracias!!
    La verdad que me fue muy útil!
    Saludos.

  2. kantun
    dilluns, 29 de març de 2010 a les 01:22 | #2

    Solo una consulta, quizas me la veas estupida pero no la note. Disculpa?, como se llamaria el archivo o cada bloque de codigo es uno diferente o es el mismo.

    Espero no te moleste, no me he adentrado tanto en php, lo puedo entender pero esto es nuevo. PD: Exelente blog =D

  3. dilluns, 29 de març de 2010 a les 23:01 | #3

    Si lees todo entero verás que es totalmente lineal 😉

    Suerte con tu aprendizaje! 😀

  4. dimarts, 27 de juliol de 2010 a les 00:10 | #4

    De verdad estoy muy agradecido man, mira que tuve que pagar a un jiripollas para que no me logre nada, y despues de haber intentado yo solo con uno y con otra opcion, al fin encuentro tu post y me ayudo mucho, gracias de verdad, ya si me permites publicare este post en uno de mis foros, obiamente poniendote un enlace.

    Saludos..

  5. dimarts, 27 de juliol de 2010 a les 22:30 | #5

    Claro que sí fido, ningún problema en que publiques el post en otro foro. Ponme el enlace al foro por aquí una vez publicado por favor :)

  6. divendres, 6 d'agost de 2010 a les 05:21 | #6

    y para la encriptacion numerica de fecha de registro y fecha de cambio de contraseañ ? como haces???

  7. dissabte, 7 d'agost de 2010 a les 12:59 | #7

    Hola @Laura, los datos de la fechas no están encriptados, simplemente están en formato “UNIX time”, es decir, es el número de segundos desde el 1 de enero de 1970.

    Para convertir fechas MYQL (aaaa-mm-dd hh:mm:ss) a UNIX time puedes utilizar el método de PHP “strtotime” que te convierte fechas en formato string a UNIX time.

    Si necesitas convertir la fecha desde algún otro formato (como por ejemplo dd/mm/aaaa) tendrás que crear tu método para convertir dicha fecha a UNIX. En este caso seguramente necesitarás del método de PHP “mktime“.

    Espero que te sirva :)

  8. divendres, 25 de març de 2011 a les 18:24 | #8

    Muy bueno el post y ¡funciona!
    Bueno solo una pega que ahora la solucionare y es que por defecto el usuario que genera es un admin..
    Supongo que tendré que cambiar “group_id”=>2 y o “user_type”=>1,
    Muchas gracias un saludo.

  9. divendres, 25 de març de 2011 a les 18:27 | #9

    Pues en teoría es un usuario estándar el que registras.. pero claro, fíjate en la fecha del post (enero de 2009). Ésta versión es la 3.0 pelada. Es más, apostaría a que ni siquiera era estable xDD Así que puede que haya cosas que han cambiado.

    Y claro que funciona, o qué pensabas?? ;p

  10. dimarts, 1 de maig de 2012 a les 01:49 | #10

    Tengo una pregunta existencial con respecto a ese codigo que si todo ese codigo es en un archivo en blanco y si es asi como se llama y en que directorio de todo las carpeta del proyecto phpbb la tengo que colocar o de lo contrario si es de editar un archivo en que directorio se encuentra y como se llama

    PD: aunque no viene al caso sabe alguien de alguna forma de implementar jquery en el editor de tags de bbcode para trabajar con facybox ??

    muchas gracias de antemano

  11. diumenge, 13 de maig de 2012 a les 07:56 | #11

    Este código no es más que la metodología a seguir a la hora de registrar usuarios externamente a phpBB. La implementación variará en función de tu código…

Comentaris tancats.