• Publicidad

CGI::Application y problema autenticación

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

CGI::Application y problema autenticación

Notapor danimera » 2009-03-11 13:30 @604

No sé cómo hacerme explicar pero estoy abnegado con las sesiones en Perl, utilizo el CGI::Application::Plugin::Authentication; y todo funciona bien para el primer login(), pero de ahí en adelante la sesión no se mantiene. En la configuración del login.pm tengo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$self->session_config(
    CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'/tmp'} ],
    # CGI_SESSION_OPTIONS => [ "driver:File", '9292a187991bec3e0f9df657757ef9ec', {Directory=>'/'} ],
       COOKIE_PARAMS       => {
                                -expires => '+24h',
                                -path    => '/',
                              },
       SEND_COOKIE         => 1,
);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Bueno, hago el login() y me redirecciona a admin.pl donde tengo un procedimiento en admin.pm que necesita autenticación para ingresar y la primera vez me ingresa bien Y si hago un Dumper de $self->query obtengo esto:

Código: Seleccionar todo
$VAR1 = bless( {
                 '.parameters' => [],
                 'use_tempfile' => 1,
                 '.charset' => 'ISO-8859-1',
                 '.cookies' => {
                     'CGISESSID' => bless( {
                             'value' => [
                                 'ef44c2dc07a4a227a388dd22cc3462e0'
                             ],
                             'name' => 'CGISESSID',
                             'path' => '/'
                         }, 'CGI::Cookie' ) },
                 '.fieldnames' => {},
                 'param' => {},
                 'escape' => 1
    }, 'CGI' );


Ahí está bien, la sesión se sostiene.

Pero cuando ya estando en admin.pl quiero llamar de nuevo el método o actualizo la página para imprimir el mismo Dumper de $self->query obtengo esto:

Código: Seleccionar todo
$VAR1 = bless( {
                 '.script_name' => '/admin/admin.pl',
                 '.parameters' => [],
                 'use_tempfile' => 1,
                 '.path_info' => '',
                 '.charset' => 'ISO-8859-1',
                 '.fieldnames' => {},
                 '.cookies' => undef,
                 'param' => {},
                 'escape' => 1
               }, 'CGI' );


Y la configuración dentro de mi admin.pm es la misma que tengo de login.pm no sé si tiene que ver un problema con el envío de las cookies o la obtención de ellas, la verdad no sé, no tengo ni la remota idea de qué hacer.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Notapor explorer » 2009-03-11 14:23 @641

Sé muy poco de C::A, pero viendo la sinopsis de C::A::P::A, el tema se reduce a meter a todos los modos que queremos proteger con el método protected_runmodes().

Se supone que el módulo se encargará de llamar, desde authen() al driver que hayamos definido, para decidir si el usuario está o no autenticado.

En cuanto a las sesiones, según cuenta la documentación, o usas el atributo STORE o C::A::P::A usará CGI::Application::Plugin::Session.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-03-11 14:38 @651

Bueno realmente lo utilizo y me funciona bien pero tengo el problema que tengo que pasar siempre el ID de la sesión por ejemplo con HTML::Template para tengo que ponerle a todos los vínculos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $self = shift;
sub loc{
    my $error = shift;
    my $datos =$self->query();
    my $session = $self->session();
    my $template;

    $template=$self->load_tmpl("../templates/admin/localizaciones.html");
    $template->param(CGISESSID =>  $session->id ); #paso la seccion por parametro
    $template->param(CONTENIDO =>  "Mis Localizaciones" );
    #return "<pre>".Dumper $form;
    return $template->output;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si lo hago así para toda cosa bien, pues claro, todo funciona bien, perfecto... pero por ejemplo, si la persona actualiza la página del navegador ahí muere si no paso el parámetro CGISESSID... entonces no sé qué pasa con el envío de las cookies o las cabeceras, no se DEBERÍA ENVIARLOS AUTOMÁTICAMENTE :( creo, ¡Y no he podido superar ese problema en Perl, pensé que usando este framework podría solucionarlo, pero no... :x ¡No sé qué sugerencia puedan darme! Sin eso ya no puedo seguir en el proyecto.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2009-03-11 17:19 @763

Pero... vamos a ver...

Si antes pusiste la opción SEND_COOKIE => 1, entonces, ¿por qué guardas en la plantilla el valor de CGISESSID?

Se supone que el trabajo de C::A::P::Session es justamente olvidarte del trabajo de llevar la gestión de la sesión. En la documentación de C::A::P::Session, en la función session_cookie, se dice que esa función añade una cookie con el ID de sesión a las cabeceras de salida, PERO es que además, esta función es la que se llama de forma automática cuando llamamos a $self->session por primera vez, por lo que en realidad nunca necesitamos llamarla. Vamos, que quiere decir que la gestión de sesión la hace toda el módulo.

Si vas al final de la documentación -repito que yo no he hecho nada con estos módulos, así que me estoy fiando del manual-, hay un ejemplo de uso de C::A::P::Session. Verás que en la parte de leer la plantilla y rellenarla, se hace con los "session parameters", los parámetros que se mantienen en esa sesión (nuestras variables)... pero no vemos por ninguna parte al parámetro CGISESSID.

Otro comentario: yo también estoy con C::A en estos momentos, y he hecho caso de algún texto que encontré por Internet, en el que aconsejaban que la autenticación la sacáramos del trabajo del cgi. Así que lo que he hecho es poner un fichero .htaccess que bloquea acceso al directorio donde está el cgi hasta que el usuario realiza una autenticación básica/clásica hecha por el propio navegador/servidor web. Así, solo tengo que concentrarme en la aplicación.

Es otra opción, claro. Lo más profesional sería usar un módulo de la rama Apache:: o C::A::P::A, como tienes tu.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-03-11 18:30 @812

Pero... vamos a ver...

Si antes pusiste la opción SEND_COOKIE => 1, entonces, ¿por qué guardas en la plantilla el valor de CGISESSID?


Pues la verdad no me funciona si no cargo el valor de CGISESSID :wink: no sé qué rayos pasa, pero no me funciona, entiendo que SEND_COKIE => 1 ya la envía, eso lo puedes mirar en el primer post que hice, cuando actualizo la pantalla.

Se supone que el trabajo de C::A::P::Session es justamente olvidarte del trabajo de llevar la gestión de la sesión. En la documentación de C::A::P::Session, en la función session_cookie, se dice que esa función añade una cookie con el ID de sesión a las cabeceras de salida, PERO es que además, esta función es la que se llama de forma automática cuando llamamos a $self->session por primera vez, por lo que en realidad nunca necesitamos llamarla. Vamos, que quiere decir que la gestión de sesión la hace toda el módulo.


Eso tenía entendido yo, y por eso me arriesgué a usarlo.

Si vas al final de la documentación -repito que yo no he hecho nada con estos módulos, así que me estoy fiando del manual-, hay un ejemplo de uso de C::A::P::Session. Verás que en la parte de leer la plantilla y rellenarla, se hace con los "session parameters", los parámetros que se mantienen en esa sesión (nuestras variables)... pero no vemos por ninguna parte al parámetro CGISESSID.


Ahan el ejemplo es sencillo, e incluso me basé en otros que hay en la web, donde funciona perfectamente.

Código: Seleccionar todo
Otro comentario: yo también estoy con C::A en estos momentos, y he hecho caso de algún texto que encontré por Internet, en el que aconsejaban que la autenticación la sacáramos del trabajo del cgi. Así que lo que he hecho es poner un fichero [b].htaccess[/b] que bloquea acceso al directorio donde está el cgi hasta que el usuario realiza una autenticación básica/clásica hecha por el propio navegador/servidor web. Así, solo tengo que concentrarme en la aplicación.


Para serte sincero si no logro solucionar eso me tocará pasarme a esta manera, pero igual seguirán los problemas cuando quiera guardar algún dato de sesión, como un carro de compras por decir algo.

De todas maneras no me envía las cookies, o no las carga al siguiente request :shock: :shock: :shock: Qué rayos puede ser.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor danimera » 2009-03-11 18:47 @824

Ahora que comprendo mejor todo esto. POR COSA DE DIOS O DEL DIABLO ESO YA FUNCIONA... ESPERO QUE SEA ESTABLE... YA NO NECESITÉ PASAR CGISESSID...

Creo que puede ser el fin de este post.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2009-03-12 02:26 @143

No, no ha terminado...

Necesitamos saber qué y cómo lo has hecho. ;)
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-03-12 07:46 @365

Bueno resulta que tenía esta línea de configuración en mi código dentro del setup del CGI::Application:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$self->session_cookie(-secure => 1, -expires => '+1w');
# Force the cookie header to be sent including some
  # custom cookie parameters
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé porqué se la puse, creo que era por que tenía ese problema de que no me mantenía la sesión, pero bueno, cuando le pongo esto tengo el problema y si se lo quito pues ya no lo tengo, así que creo que eso fue la solución : :P
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor kidd » 2009-03-12 08:11 @383

Hola:

El problema es que si activas el párametro -secure es porque estás bajo una conexión segura https, si no lo estás lógicamente tus cookies no se salvarán de manera correcta.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2009-03-12 08:14 @385

Del manual de CGI, en la sección HTTP_COOKIES:
Código: Seleccionar todo
4. a "secure" flag

    If the "secure" attribute is set, the cookie will only be sent to your script if the CGI request is occurring on a secure channel, such as SSL.

¿Será eso?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron