Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/08/2003, 10:07
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola kaiowas,

Mmmm, si eres quien creo que eres, ¡me alegra verte después de tanto tiempo! Aunque no sé si te acuerdes de mí; solía visitar estos foros hace algún tiempo ya, y en ese entonces usaba el nick `Eric'. De hecho, si no me equivoco, aun tenemos pendiente un asunto relacionado con algunas birras.. jeje :)


Y bien, sobre el problema que mencionas, se me ocurren, en principo, dos alternativas:
  • Utilizar una página intermedia para eliminar la cookie. Por supuesto, no es una solución muy cómoda, y muy posiblemente la has descartado ya precisamente por lo poco natural que parece tener que recurrir a una página extra sólo para eliminar el efecto de una cookie.
  • Por otra parte, pienso que quizás no es completamente necesario que la cookie haya sido eliminada antes de visitar la página de inicio de sesión. Un escenario posible es que dentro de tu página de inicio de sesión elimines todas las cookies existentes (o únicamente aquellas relacionadas con el mecanismo de autenticación) y mostrar siempre un formulario de inicio de sesión. Algo como:

    Código:
    <?php
    
    // Eliminar cookies
    
    foreach (array_keys ($_COOKIE) as $nombre) {
        setcookie ($nombre, "", time() - 3600);
        unset ($_COOKIE[$nombre]);
    }
    
    ?>
    
    <p>Por favor ingrese sus datos de inicio de sesión:</p>
    
    <form action="validar.php" method="post">
    <table>
    <tr>
        <td>Nombre de usuario:</td>
        <td><input name="usuario" /></td>
    </tr>
    <tr>
        <td>Contraseña:</td>
        <td><input type="password" name="contrasenya" /></td>
    </tr>
    <tr>
        <td colspan="2"><input type="submit" value=" Ingresar " /></td>
    </tr>
    </table>
    </form>
    
    Pero bueno, hay otro posible escenario, y es que no puedas darte el lujo de eliminar todas las cookies en la página de inicio de sesión, y ésta deba verificar además si el usuario ya inició su sesión.

    Este es un inconveniente particularme común cuando no se cuenta con una página dedicada exclusivamente al inicio de sesión de un usuario, en cuyo caso esta página podría simplemente ignorar cualquier cookie existente. Si el inicio de sesión se encuentra en una página en donde debe aplicarse el mecanismo de autenticación, y dependiendo de éste debe mostrar el formulario de inicio de sesión o no, entonces podría recurrirse a una variable adicional que indique si debe forzarse la eliminación de cookies y el envío del formulario de inicio de sesión al cliente.

Yo sé que este último punto suena un poco confuso. Pero consideremos el siguiente ejemplo, y veamos si nos aclara un poco las cosas.

Supongamos que contamos con el valor de una cookie llamada `sesion' para verificar si un usuario ya ha iniciado su sesión. Pensemos que entonces la página de inicio de sesión luce algo así:


Código:
<?php

// Si existe la cookie `sesion' significa que el usuario ya ha
// iniciado su sesion.

if (isset ($_COOKIE['sesion'])) {

    // Supongamos que la cookie `nombre' tiene el nombre del usuario
    echo 'Hola ' . $COOKIE['nombre'];

    // Aqui se pueden incluir mas cosas....

} else {  // Si el usuario aparentemente no ha iniciado su sesion

    echo <<<FIN_FORMULARIO
<p>Por favor ingrese sus datos de inicio de sesión:</p>

<form action="validar.php" method="post">
<table>
<tr>
    <td>Nombre de usuario:</td>
    <td><input name="usuario" /></td>
</tr>
<tr>
    <td>Contraseña:</td>
    <td><input type="password" name="contrasenya" /></td>
</tr>
<tr>
    <td colspan="2"><input type="submit" value=" Ingresar " /></td>
</tr>
</table>
</form>
FIN_FORMULARIO;

}  // Cierre del `else'

?>

Bajo este modelo, es claro que si dirigimos al usuario hacia la página de inicio de sesión cuando la cookie `sesion' ya ha sido definida, el usuario no verá nunca el formulario de inicio de sesión:

Código:
Hola Usuario,
si no eres tu <a href="inicio.php">click aqui para ingresar</a> con tu nick.

En este caso, el uso de una variable adicional, que por ejemplo podríamos pasar en el query de la URL para recuperarla como una variable GET, podría sacarnos del lío. Nuestro mensaje tendría que ser modificado por algo de este estilo:

Código:
Hola Usuario,
si no eres tu <a href="inicio.php?logout=1">click aqui para ingresar</a> con tu nick.
Nótese la definición de la variable `logout', cuyo valor no es importante, sólo nos interesa que sea definida.

De este modo, nuestra página de inico de sesión podría ser modificada para que se validara la existencia de la variable logout:

Código:
// Si existe la cookie `sesion', y _no_ esta definida la variable
// `logout' pasada por el metodo GET, significa que el usuario ya ha
// iniciado su sesion.

if (isset ($_COOKIE['sesion']) and ! isset ($_GET['logout'])) {

// Aqui viene el resto del codigo

Por supuesto, todo esto podría adaptarse dependiendo de cómo estés implementando tu mecanismo de validación de usuarios. Sería cuestión de que nos brindaras más información para poder estudiar más a fondo el problema. :)

Un cordial saludo