Foros del Web » Creando para Internet » Sistemas de gestión de contenidos »

COmo autentica PHPBB ¿cookies? ¿sesiones?

Estas en el tema de COmo autentica PHPBB ¿cookies? ¿sesiones? en el foro de Sistemas de gestión de contenidos en Foros del Web. Hola que tal Mi pregunta es esa, de que manera autentica PHPBB forum. Esta pregunta es porque quiero integrar el foro phpbb en un sitio ...
  #1 (permalink)  
Antiguo 18/12/2004, 21:14
Avatar de cookie  
Fecha de Ingreso: agosto-2002
Mensajes: 688
Antigüedad: 21 años, 8 meses
Puntos: 0
COmo autentica PHPBB ¿cookies? ¿sesiones?

Hola que tal

Mi pregunta es esa, de que manera autentica PHPBB forum.

Esta pregunta es porque quiero integrar el foro phpbb en un sitio hecho con ASP, y quiero que cuando se inicie sesion en el foro, se pueda pasar "transparentemente" por las secciones del sitio web.

Esto es porque , hasta ahorita ya uso la misma contraseña en ambas partes (sitio ASP y PHPBB) pero cuando me paso del sitio web al foro, se tiene que volver a teclear username y contraseña


gracias y saludos
__________________
___________________________

do the evolution ¡
Mineriaenlinea.com
  #2 (permalink)  
Antiguo 20/12/2004, 04:48
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 5 meses
Puntos: 5
phpBB usa para el sistema de usuarios sesiones y cookies, al hacer login, phpBB compara la clave introducida con la que hay en la base de datos. Pero con el siguiente añadido, al realizar el registro, no se mete en la base de datos la clave plana, sino el hash md5 de la clave, de esta forma al introducir el usuario su clave para hacer login, se pasa a md5, y esa conversión es la que se usa para compara en la base de datos.
Hay una forma de poner un formulario en una página para que el usuario haga login, utilizando el sistema de usuarios del foro, pero que no obstante, se redirija al usuario a otra página que no sea el índice del foro:
http://www.phpbb.com/kb/article.php?article_id=216
Pero el problema es que usa el sistema de sesiones de phpBB. Luego hay un código estándar, que debería de encabezar todos los scripts que pretendan seguir con la sesión de phpBB:
Código PHP:
define('IN_PHPBB'true);
$phpbb_root_path './';
include(
$phpbb_root_path 'extension.inc');
include(
$phpbb_root_path 'common.'.$phpEx);

//
// Start session management
//
$userdata session_pagestart($user_ipPAGE_INDEX);
init_userprefs($userdata);
//
// End session management
// 
Una vez que tenemos sesión phpBB iniciada, existen una serie de Arrays que se generan automáticamente al iniciar sesión, cómo por ejemplo el array $userdata. Se trata de un array indexado por cadenas, cuyos campos son de la tabla phpbb_users pero para el usuario conectado. Así, $userdata['username'] contiene el nombre del usuario conectado, $userdata['user_id'] contiene el identificador del usuario etc.
Ahora bien, yo no sé, hasta que punto será manejable esto con ASP, lo que te he puesto sirve para colocar un formulario de login en una página ajena al foro y que al loguear no te encamine al foro necesariamente, y el segundo código es la cabecera que supuestamente han de tener todos los script que usen sesiones phpBB.
Lo mismo partiendo del formulario que se explica en el articulo te puedes crear una cookie que leerías desde ASP...
Lo siento pero de momento no sé mucho ASP, espero que des con alguna solución.

Salu2 ;) (lo mismo no te he aclarado gran cosa...)
__________________
[+]
[+]
  #3 (permalink)  
Antiguo 20/12/2004, 08:08
Avatar de cookie  
Fecha de Ingreso: agosto-2002
Mensajes: 688
Antigüedad: 21 años, 8 meses
Puntos: 0
gracias por tu ayuda Yoseman,

Actualmente ya tengo una pagina de login y un formulario de registro hecha con ASP utilizando la misma tabla de usuario de PHPBB, cuando registro Username y passowrd en el formulario ajeno me sirve perfectamente para loggear en el foro y en mi sitio, la bronca es que cuando inicio session en el foro, y de ahi me quiero pasar al sitio, hay que volver a escribir nombre de usuario y contraseña y viceversa ...

Por eso quisiera saber de que manera se pueden compartir las sessiones ...

Algun otro consejo ?
__________________
___________________________

do the evolution ¡
Mineriaenlinea.com
  #4 (permalink)  
Antiguo 20/12/2004, 20:30
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 5 meses
Puntos: 5
Bueno phpbb utiliza una tabla de la base de datos llamada phpbb_sessions:
Código:
CREATE TABLE phpbb_sessions(
	session_id varchar(32) NOT NULL,
	session_user_id mediumint(8) NOT NULL,
	session_start int(11) NOT NULL,
	session_time int(11) NOT NULL,
	session_ip varchar(8) NOT NULL,
	session_page int(11) NOT NULL,
	session_logged_in tinyint(1) NOT NULL,
	session_robot varchar(32), 
	PRIMARY KEY (session_id), 
	KEY session_user_id (session_user_id), 
	KEY session_id_ip_user_id (session_id, session_ip, session_user_id)
);
para gestionar las sesiones, y otra llamada phpbb_users que contiene algunos datos que te pueden servir:
Código:
CREATE TABLE phpbb_users(
	user_id mediumint(8) NOT NULL,
	user_active tinyint(1) DEFAULT '1',
	username varchar(25) NOT NULL,
	user_password varchar(32) NOT NULL,
	user_session_time int(11) NOT NULL,
	user_session_page smallint(5) NOT NULL,
	user_lastvisit int(11) NOT NULL,
	user_regdate int(11) NOT NULL,
	user_level tinyint(4),
	user_posts mediumint(8) unsigned NOT NULL,
	user_timezone decimal(5,2) DEFAULT '0.00' NOT NULL,
	user_style tinyint(4),
	user_lang varchar(255),
	user_dateformat varchar(14) DEFAULT 'd M Y H:i' NOT NULL,
	user_new_privmsg smallint(5) unsigned NOT NULL,
	user_unread_privmsg smallint(5) unsigned NOT NULL,
	user_last_privmsg int(11) NOT NULL,
	user_emailtime int(11),
	user_viewemail tinyint(1),
	user_attachsig tinyint(1),
	user_allowhtml tinyint(1) DEFAULT '1',
	user_allowbbcode tinyint(1) DEFAULT '1',
	user_allowsmile tinyint(1) DEFAULT '1',
	user_allowavatar tinyint(1) DEFAULT '1' NOT NULL,
	user_allow_pm tinyint(1) DEFAULT '1' NOT NULL,
	user_allow_viewonline tinyint(1) DEFAULT '1' NOT NULL,
	user_notify tinyint(1) DEFAULT '1' NOT NULL,
	user_notify_pm tinyint(1) NOT NULL,
	user_popup_pm tinyint(1) NOT NULL,
	user_rank int(11),
	user_avatar varchar(100),
	user_avatar_type tinyint(4) NOT NULL,
	user_email varchar(255),
	user_icq varchar(15),
	user_website varchar(100),
	user_from varchar(100),
	user_sig text,
	user_sig_bbcode_uid varchar(10),
	user_aim varchar(255),
	user_yim varchar(255),
	user_msnm varchar(255),
	user_occ varchar(100),
	user_interests varchar(255),
	user_actkey varchar(32),
	user_newpasswd varchar(32),
	user_pro smallint(1),
	user_privmsgs_per_page smallint(3) DEFAULT '5',
	user_punto decimal(11,0) NOT NULL, 
	PRIMARY KEY (user_id), 
	KEY user_session_time (user_session_time)
);
Se supone que con esa tabla, ya podrías crear una funcioncilla que determine si el usuario actual (parto del supuesto de que desde ASP, hay formas de averiguar la ip del cliente, pero luego seguiré con eso, es que no he programado nunca con ASP) está o no conectado.
Bien para determinar si el usuario está conectado o no, lo primero que debemos de hacer, es establecer un tiempo de expiración para la sesión, sin eso, no podremos determinar si el usuario está conectado o no. Y luego simplemente(digo simplemente pero tiene su miga) se trataría de buscar en la tabla phpbb_sessions, si existe una coincidencia de la i.p del cliente en el campo session_ip, y si la hay, coger el campo session_time que contiene la fecha en formato timestamp de la última vez que phpBB tubo noticias de esa IP. Entonces consultariamos el valor de la resta del tiempo actual (función time () ) con ése valor que acabamos de extraer, y si el resultado es mayor al tiempo que nosotros consideramos que ha de pasar para que la sesión no siga pués se acabó, el usuario ya no se supondrá conectado, y si no, pués recogemos el session_user_id, y consultamos en la tabla phpbb_users los datos que requiramos del usuario. Yo diría que para que todo tuviese sentido la duración de la sesión debería de ser la misma que en phpbb, está duración cómo sabes se puede configurar en el ACP, pero además es accesible supongo desde ASP(por si quieres hacer las cosas bien), en la tabla phpbb_config, te pongo un backup de mi fila para ese dato:
Código:
INSERT INTO phpbb_config (config_name, config_value) VALUES('session_length', '3600');
Bueno sigamos, hemos hablado de utilizar la I.P del cliente para consultar a nuestra DB(tabla phpbb_sessions) sí existe una coincidencia y en este caso actuar, sí el tiempo de último acceso(phpbb_ssesions.session_time) es anterior al actual menos el tiempo de sesión no se activará una contiguidad en la sesión, pero resulta que phpbb, a la hora de introducir la I.P en esa tabla que nosotros necesitamos para nuestra funcioncilla, la codifica.
Te pongo una especie de resumen de lo que hace para sacar esa codificación:
Código PHP:
<?
function encode_ip($dotquad_ip)
{
$ip_sep explode('.'$dotquad_ip);
return 
sprintf('%02x%02x%02x%02x'$ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}
$client_ip = ( !empty($HTTP_SERVER_VARS['REMOTE_ADDR']) ) ? $HTTP_SERVER_VARS['REMOTE_ADDR'] : ( ( !empty($HTTP_ENV_VARS['REMOTE_ADDR']) ) ? $HTTP_ENV_VARS['REMOTE_ADDR'] : $REMOTE_ADDR );
print 
$client_ip."<br>";
$user_ip encode_ip($client_ip);
print 
$user_ip;
?>
Para averiguar la I.P utiliza una condición anidada, pero es muy importante, que cuando hagas tus pruebas en ASP, la I.P que te devuelve tu script coincida con la que tevuelve este script, sino todo esto que estamos haciendo no sirve, lo digo porque hay varias formas de obtener la I.P cómo por ejemplo HTTP_X_FORWARDED_FOR, que en las últimas versiones de phpbb ha sido suprimido(consulta el archivo common.php lin.186 para ver si tienes éste comentario):
Cita:
//
// Obtain and encode users IP
//
// I'm removing HTTP_X_FORWARDED_FOR ... this may well cause other problems such as
// private range IP's appearing instead of the guilty routable IP, tough, don't
// even bother complaining ... go scream and shout at the idiots out there who feel
// "clever" is doing harm rather than good ... karma is a great thing ... :)
Y luego la codificación de la I.P consiste simplemente en pasar a hexadecimal (con las letras minúsculas) cada una de las cuatro números de la I.P, y quitar los puntos. Mira http://elotrositio.tuarrobanet.com/cod_ip.php aquí te sale cómo recoge phpBB tu i.p y cómo la codificaría. Por eso necesitas crearte una funcioncilla que 'codifique' la I.P de esta forma, sino preguntarás algo a la DB que nunca obtendrá resultados.
Creo que respecto de cómo consultar las sesiones phpBB es todo, ahora bien, si desde tu página quieres además continuar (estamos hablando de trabajar con ASP) con esa sesión, lo que deberiamos hacer a cada recarga es basarte en ese mismo proceso, es decir, necesitarías al menos actualizar :
phpbb_users.user_session_time _>tiempo de la sesión actual(de no ser que sea invi en cuyo caso nada)
phpbb_users.user_lastvisit ->tiempo de último acceso de usuario(de no ser que bla bla bla)
phpbb_sessions.session_time -> tiempo de sesión (para invis también)
Con la fecha en timestamp para la I.P del usuario cliente y eliminar las filas de la sesión que ya hayan expirado. Si no haces esto probablemente si un usuario ha estado navegando por tu foro, y lo abandona para navegar por tu web en ASP, al volver, al no actualizar el tiempo de sesión se le supondrá desconectado.
Bueno hay una serie de cosillas que te quisiera además comentar, en la tabla phpbb_sessions, se registran todos los usuarios que entran al foro, algunos son usuarios registrados, y otros no, los que tienen identificador -1 son usuarios invitados. Cuando un usuario (invitado o registrado) entra la primera vez(o sea no está esa I.P en la tabla) se inserta además el valor session_start, que contiene la fecha en timestamp del primer acceso a la sesión. Si un usuario se loguea, la sesión de invitado debería de desaparecer, y si se 'desloguea' debería de desaparecer su sesión de usuario(con su session_user_id de usuario que ya sabemos que se diferencia de la de anonimo que es -1 siempre) pero aparecer una sesión de usuario anónimo con esa I.P.
__________________
[+]
[+]

Última edición por yoseman; 20/12/2004 a las 20:54
  #5 (permalink)  
Antiguo 20/12/2004, 20:54
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 5 meses
Puntos: 5
Luego tenemos además el campo session_page , que por sí te interesa, phpBB utiliza para determinar en qué página concreta del foro el usuario está navegando. En el archivo includes/constants.php están definidas una serie de constantes que asignan un identificador a cada página:
Código:
// Page numbers for session handling
define('PAGE_INDEX', 0);
define('PAGE_LOGIN', -1);
define('PAGE_SEARCH', -2);

define('PAGE_REGISTER', -3);
define('PAGE_PROFILE', -4);
define('PAGE_VIEWONLINE', -6);
define('PAGE_VIEWMEMBERS', -7);
define('PAGE_FAQ', -8);
define('PAGE_POSTING', -9);
define('PAGE_PRIVMSGS', -10);
define('PAGE_GROUPCP', -11);
define('PAGE_TOPIC_OFFSET', 5000);
Podrías crearte una constante más en ése archivo para poder indicar determinar en el 'foro' que el usuario esta navegando en la web desde el viewonline.php y desde el mismo ACP, pero ello requería algunos cambios en unos cuantos archivos: Te pongo un archivo que te indica dichos cambios, pero cómo algo secundario, si quieres te puedes meter a ello cuando consigues lo básico:
Código:
# 
#-----[ OPEN ]------------------------------------------ 
# 
viewonline.php

# 
#-----[ FIND ]------------------------------------------ 
# 
				case PAGE_FAQ:
					$location = $lang['Viewing_FAQ'];
					$location_url = "faq.$phpEx";
					break;

# 
#-----[ AFTER, ADD ]------------------------------------------ 
# 
				case PAGE_TEMPLATE:
					$location = $lang['Template'];
					$location_url = "template.$phpEx";
					break;.

# 
#-----[ OPEN ]------------------------------------------ 
# 
admin/index.php

# 
#-----[ FIND ]------------------------------------------ 
# 
						case PAGE_FAQ:
							$location = $lang['Viewing_FAQ'];
							$location_url = "index.$phpEx?pane=right";
							break;

# 
#-----[ AFTER, ADD ]------------------------------------------ 
# 
						case PAGE_TEMPLATE:
							$location = $lang['Template'];
							$location_url = "template.$phpEx?pane=right";
							break;

# 
#-----[ FIND ]------------------------------------------ 
# 
					case PAGE_FAQ:
						$location = $lang['Viewing_FAQ'];
						$location_url = "index.$phpEx?pane=right";
						break;

# 
#-----[ AFTER, ADD ]------------------------------------------ 
# 
					case PAGE_TEMPLATE:
						$location = $lang['Template'];
						$location_url = "template.$phpEx?pane=right";
						break;

# 
#-----[ OPEN ]------------------------------------------ 
# 
language/lang_english/lang_main.php

# 
#-----[ FIND ]------------------------------------------ 
# 
?>

# 
#-----[ BEFORE, ADD ]------------------------------------------ 
# 
$lang['Template'] = 'Template';

# 
#-----[ OPEN ]------------------------------------------ 
# 
includes/constants.php

# 
#-----[ FIND ]------------------------------------------ 
# 
define('PAGE_GROUPCP', -11);

# 
#-----[ AFTER,  ADD ]------------------------------------------ 
# 
define('PAGE_TEMPLATE', -1045);


# 
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------ 
# 
# EoM
En la línea que te dice de añadir la variable $lang['Template'] = 'Template'; tu simplemente pones $lang['Template'] = 'WEB'; o $lang['Template'] = 'página principal'; o lo que se te ocurra. Aunque si haces eso, entonces tienes que actualizar el campo session_page con el identificador, que en éste caso, para la página que hemos definido es -1045 en tu script que continua y gestiona la sesión phpBB. De esta forma, podrías saber desde el Administration Control Panel si el usuario está en la web o en el foro, y tambien en el viewonline.php
Pero bueno eso ya sería rizar el rizo.

Comprendo que la cosa no es del todo sencilla, pero yo diría que con esto debería de funcionar, otra cosa es que se pueda implementar fácilmente con ASP, pero bueno todo es ponerse :)

Respecto de las sesiones, creo que estaría bien, para el caso de que el usuario no acepte ni siquiera las cookies de sesión, propagar la variable sid por query string en caso de que el usuario esté logueado(al menos) al acceder de nuevo al foro, porque sino phpBB, en el caso de que no exista cookie de sesión, no podrá buscar identificador de usuario para esa sesión y está se perdería.
Eso es lo que deduzco de ésta parte de código:
Código PHP:
function session_pagestart($user_ip$thispage_id)
{
    global 
$db$lang$board_config;
    global 
$HTTP_COOKIE_VARS$HTTP_GET_VARS$SID;

    
$cookiename $board_config['cookie_name'];
    
$cookiepath $board_config['cookie_path'];
    
$cookiedomain $board_config['cookie_domain'];
    
$cookiesecure $board_config['cookie_secure'];

    
$current_time time();
    unset(
$userdata);

    if ( isset(
$HTTP_COOKIE_VARS[$cookiename '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename '_data']) )
    {
        
$sessiondata = isset( $HTTP_COOKIE_VARS[$cookiename '_data'] ) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename '_data'])) : array();
        
$session_id = isset( $HTTP_COOKIE_VARS[$cookiename '_sid'] ) ? $HTTP_COOKIE_VARS[$cookiename '_sid'] : '';
        
$sessionmethod SESSION_METHOD_COOKIE;
    }
    else
    {
        
$sessiondata = array();
        
$session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : '';
        
$sessionmethod SESSION_METHOD_GET;
    }

    
// 
    
if (!preg_match('/^[A-Za-z0-9]*$/'$session_id))
    {
        
$session_id '';
    }

    
//
    // Does a session exist?
    //
    
if ( !empty($session_id) )
    {
        
//
        // session_id exists so go ahead and attempt to grab all
        // data in preparation
        //
        
$sql "SELECT u.*, s.*
            FROM " 
SESSIONS_TABLE " s, " USERS_TABLE " u
            WHERE s.session_id = '$session_id'
                AND u.user_id = s.session_user_id"

Salu2 (espero haberte ayudado con todo este rollo, yo no he probado, pero para mí que lo básico debería de funcionar)
__________________
[+]
[+]

Última edición por yoseman; 21/12/2004 a las 03:07
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:14.