• Publicidad

Crear y leer cookies

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Crear y leer cookies

Notapor marcmb » 2010-05-08 09:07 @421

Buenas, hace una semana más o menos que hice unas preguntas y me recomendaron el uso de módulos de Perl y más tarde el uso de cookies, y les comenté que cuando terminara la web y funcionara me pondría a estudiarme los módulos y luego las cookies. El tema de los módulos ya lo tengo resuelto y entendido (ya he hecho un encriptador y ¡funciona! :D ) y ahora quería ponerme a hacer cookies para que los usuarios no tengan que estar logueando cada vez que entran a la web, por lo que he estado mirando en perldoc, pero no me acabo de aclarar, pues como siempre todo está en inglés... y aunque entiendo muchas cosas siempre hay esos pequeños detalles que hacen que no acabe de comprender el buen uso de Perl :P

En teoría, si yo quiero hacer una cookie que dure una hora (creo que) tendría que hacer lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use CGI qw(:standard);
  2. use CGI::Cookie;
  3.  
  4. my $c = new CGI::Cookie(-name => 'galletita',
  5.                         -value => "$usuario", # ¿esto se puede hacer?
  6.                         -expires => '+1H',
  7.                         -domain => '.midominio.com',
  8.                         -path => '/cgi-bin',  # para usar cgi-bin
  9.                         -secure => 0,         # Ya que no uso SSL
  10. );
  11. # Esto me imagino que es para poner la cookie en la cabecera del html (corrígeme si me equivoco)
  12. print header(-cookie=>[$cookie1]);
  13. # Cookies dentro del alcance
  14. %cookies = fetch CGI::Cookie;
  15. $id = $cookies{'ID'}->value;
  16.  
  17. # Crear las cookies devueltas de una fuente externa
  18. %cookies = parse CGI::Cookie($ENV{COOKIE});
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Entonces, según esta documentación de perldoc la creación de la cookie, sencillísima. Simplemente tendría que ponerla dentro del chequeo de usuario/contraseña justo antes de abrir el html o cgi que quiera abrir (creo). Pero lo que no sé muy bien cómo hacer uso luego de la cookie mandada, porque por ejemplo la cookie que mandaría (si lo de value=>"$usuario" se puede hacer) su id sería $usuario, que supongamos que $usuario='Pepito'.

Según:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%cookies = fetch CGI::Cookie;
$id = $cookies{'ID'}->value;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Obtendríamos la variable $id con el valor Pepito, y luego en teoría poniendo ese código en cualquier cgi supuestamente (según lo que yo he entendido) sabríamos al momento si el usuario se ha logueado dentro de la última hora o no.

Si no me he equivocado en ninguna de mis suposiciones la cosa sería muy sencilla si trabajamos con programas CGI, y si todo lo que he dicho fuera cierto (que seguro que no) después vendría la gracia de chequear la cookie directamente desde html, que eso ya lo miraré después de que me corrijas o corrobores lo dicho, y si no encontrara nada ya abriría un hilo aparte en el foro correspondiente de HTML (aunque espero no tener que hacerlo).

Agradezco cualquier respuesta de cualquier usuario.

Muchas gracias de antemano. (Y si alguien conoce de algún sitio con documentación de Perl en español ¡lo agradecería enormemente! porque hasta la fecha no he encontrado nada serio por Internet...)

Perl forever.
Avatar de Usuario
marcmb
Perlero nuevo
Perlero nuevo
 
Mensajes: 55
Registrado: 2010-05-03 07:42 @362
Ubicación: Girona

Publicidad

Re: Crear y leer cookies

Notapor explorer » 2010-05-08 10:47 @491

Aparte del resumen muy bueno que hay en Wikipedia sobre las cookies, hay otros sitios donde puedes mirar. En los directorios extra de las distribuciones de los módulos Perl, suelen haber ejemplos.

En el caso del módulo CGI, hay un apartado específico para las cookies, y en el directorio correspondiente de ejemplos, hay uno en que se muestra cómo usarlas. No referido al control de usuarios, si no de forma general.

El control de usuarios, por medio de galletas es muy básico: si el que ejecuta mi cgi me transmite una galleta, voy a la base de datos para comprobar que el contenido de la galleta (su valor) corresponde a un número de sesión. Busco ese número en la base de datos. Compruebo que la marca de tiempo (un campo que ha guardado el momento en que se creó el registro) está dentro de la ventana temporal que he fijado como duración máxima de una sesión sin intervención del usuario (el timeout de sesión). Si está dentro de ese periodo, entonces el resto de campos del registro de la base de datos me dan toda la información relativa a qué usuario es y qué es lo que estaba haciendo.

La ejecución del CGI comporta una acción por parte del usuario, bien sea a través de un campo oculto (action) seleccionado por el usuario, o bien por simple pulsación sobre un enlace de una página, que determina la ejecución de un cgi completo. En ambos casos, la galleta me indica quién es, y la selección del usuario, qué quiere hacer a continuación. Según eso, modifico las condiciones que me pide el usuario: puede ser que me esté pidiendo aumentar en uno el número de paraguas que va a comprar, o pulsar el botón de aceptación de declaración jurada por la que se compromete a no matar al presidente de los EEUU.

Anoto/agrego/modifico lo que sea en la base de datos, y, ya sé qué es lo que debo preparar para enseñar al usuario. Primero confecciono otra galleta para ser enviada en la cabecera de la página que voy a confeccionar, y luego creo el resto del HTML de la página, anotando el nuevo número de paraguas o dándole las gracias por no atentar contra la vida del presidente.

Muchas de estas cosas, llevan una serie de pasos. Aprenderlos está bien. Muy bien. Luego, verás que muchos, pero muchos módulos de Perl ayudan a simplificar toda la gestión de leer/escribir galletas, actualizar datos del usuario, etc. Entramos en los llamados entornos de trabajo CGI de Perl. Uno de los más famosos es CGI::Application.

En resumen, si solo quieres guardar datos entre llamadas, mira CGI y CGI::Cookie. Si quieres controlar una sesión de usuario, CGI::Session. Si necesitas crear una aplicación web con diversos estados, CGI::Application (y sus varias docenas de módulos). Luego, hay más entornos de trabajo CGI mucho más elaborados, cada uno de ellos prometiéndote que puedes hacer más con menos de líneas de código. Es cuestión de buscarles por CPAN.

La tarea, en ocasiones no es sencilla... recuerdo que CGI::Session me llevó mucho tiempo para entender la secuencia que se debe seguir. Y con CGI::Application, de las aplicaciones que he hecho, seguro que he metido la pata muchas veces, también en la parte de autenticación de usuarios.

Seguro que hay más lectores de estos foros que nos pueden echar una mano.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear y leer cookies

Notapor marcmb » 2010-05-08 11:08 @505

Muchas gracias por la respuesta tan elaborada, ya decía yo que parecía demasiado fácil, pero como de momento todo lo estoy haciendo por el puro vicio de aprender empezaré con lo básico.

Pero como estamos en fin de semana ya me pondré el lunes con ello con un cgi de pruebas que solo sirva para mandar y recibir la cookie en cuestión, y si consigo que funcione ya haré directamente un módulo para que se ocupe de las gestiones de las cookies o iré a CPAN a ver si allí encuentro algo ya hecho (que seguro que sí), pero como te digo, primero quiero aprender su uso, pues no quiero simplemente el código ya hecho, quiero saber hacerlo y entenderlo a la perfección, así luego si hay cualquier fallo ya sé por dónde tirar.

Sobre el tema usuarios tengo un archivo para cada usuario en el PC de la siguiente forma: nombredeusuario.extension donde dentro del archivo tengo la contraseña encriptada del usuario y los datos del usuario que necesito en esa web concreta sin encriptar (porque realmente no es necesario encriptarlos). Para lo que uso la web y la cantidad de usuarios de la misma no he visto conveniente de momento complicarme aprendiendo demasiadas cosas de golpe, pues luego no se asimilan bien y se cruzan ideas (al menos eso me pasa a mi).

Por cierto, ya me bajé el libro OReilly.Learning_Perl_Objects_References_And_Modules.2003 y voy a empezar a leérmelo la semana próxima, así de paso refrescaré mi inglés un poquito que lo tengo algo oxidado. Y te lo repito, muchísimas gracias por tu tiempo, como siempre (aunque no estaría de más que otros usuarios pongan su granito de arena). Por lo que dejaré este hilo abierto una semanita para ver si alguien aporta algo más al respecto y lo cerraré el sábado que viene.

Perl forever.
Avatar de Usuario
marcmb
Perlero nuevo
Perlero nuevo
 
Mensajes: 55
Registrado: 2010-05-03 07:42 @362
Ubicación: Girona

Re: Crear y leer cookies

Notapor marcmb » 2010-05-09 14:07 @630

¡Dios mio, ya he visto el maldito fallo!

Ahora son las 21:35 y cuando le mando la cookie a esta hora al imprimirla me sale:
Set-Cookie: id=prova; path=/; expires=Sun, 09-May-2010 20:35:40 GMT Date: Sun, 09 May 2010 19:35:40 GMT Content-Type: text/html; charset=ISO-8859-1

¿Cómo es posible que yo en el reloj veo la hora 21:35 pero hace como si hubiese mandado la cookie 2 horas antes?

Por culpa de esto que acabo de darme cuenta ahora no me funcionan las cookies, porque claro, si quiero que expire en una hora pues cuando voy a verla al momento ya ha expirado... ¿hay alguna explicación razonable para esto?

Agradezco cualquier respuesta, si necesitáis cualquier información pedidla, que no se me ocurre a qué es debido esto...
Avatar de Usuario
marcmb
Perlero nuevo
Perlero nuevo
 
Mensajes: 55
Registrado: 2010-05-03 07:42 @362
Ubicación: Girona

Re: Crear y leer cookies

Notapor explorer » 2010-05-09 14:59 @666

Necesitas usar CGI::Session si quieres controlar una sesión de usuario. Aquí no influye la forma del HTML.

Las galletas están asociadas a un dominio y una ruta. Mientras no cambies esos factores, la galleta se sigue transmitiendo. Le da igual que uses HTML distintos, en un menú y en un contenido: los dos están en el mismo dominio. Y si la ruta la defines a, por ejemplo, '/', entonces la galleta se transmite en todas las peticiones.

Más información, en CGI::Cookie.

Aquí (en inglés) hay un pequeño ejemplo de CGI para crear cookies y cómo leerlas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear y leer cookies

Notapor explorer » 2010-05-09 15:11 @674

La hora en que queda grabada la galleta, es correcta: las 21:35 en horario de la zona horaria de Europa/Madrid, son las 19:35 GMT (observa que pone GMT después de la hora).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear y leer cookies

Notapor marcmb » 2010-05-10 08:05 @378

Bueno, miraré todo esto por el lado bueno. He aprendido a usar algo más, pero me voy a poner ahora mismo con CGI::Session a ver qué tal me va. Gracias por todo, explorer.
Avatar de Usuario
marcmb
Perlero nuevo
Perlero nuevo
 
Mensajes: 55
Registrado: 2010-05-03 07:42 @362
Ubicación: Girona


Volver a Web

¿Quién está conectado?

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

cron