Page 1 of 1

Autenticacion user/password en una web

PostPosted: Fri Jun 11, 2010 9:27 pm
by JmGarcia
Necesito "validarme" (con USUARIO y PASSWORD) en una web (foro de meteorología) para capturar datos del tiempo automáticamente.
Necesito que sea con las WinHTTP windows services con el objeto oHttp:=CreateObject("winhttp.winhttprequest.5.1") o similar.

Con este código, cuando entro no me valido:
Code: Select all  Expand view
     
      local oHttp,cResp
      oHttp:=CreateObject("winhttp.winhttprequest.5.1")
      oHttp:SetTimeouts(30000,30000,30000,30000)
      oHttp:Open("GET","http://www.meteoXXXX.com/data.php?day=31&mounth=1&year=2010",.f.)
      oHttp:Send()
      cResp:=oHttp:ResponseText()
 

Pero al ver el código HTML de la variable "cResp" no encuentro por ningún lado la validación, siempre entro como "visitante".

Re: Autenticacion user/password en una web

PostPosted: Mon Jun 14, 2010 10:22 am
by Carlos Mora
Hola Jm,

la autenticación es una cuestión propia del sitio. Normalmente cuando te conectas lo que suele hacerse es establecer una sesión almacenando en el cliente una cookie con la clave de sesión, y los datos de la sesión en el servidor, usando algún mecanismo apropiado, por lo tanto la forma de acceder creo que pasa por establecer una sesion como usuario que genere la cookie de la sesión, y luego enviar esa cookie en las sucesivas consultas para que el servidor sepa que eres tú.
No se como se hace eso con el httprequest, pero seguramente en la documentación te dirá como porque es algo bastante común.

Un saludo,

Re: Autenticacion user/password en una web

PostPosted: Mon Jun 14, 2010 4:24 pm
by Manuel Valdenebro
El acceso a una página web se realiza en Windows con las librerias (dll) WinInet (antigua) ó WinHttp (mas moderna). El acceso se puede realizar directamente, usando funciones en "C".

http://msdn.microsoft.com/en-us/library ... 57(v=VS.85).aspx

En ambos casos, antes de realizar una petición (request), se realizan dos pasos obligatorios:

1) InternetOpen
2) InternetConnect

En la funcion InternetOpen es donde se incluye el usuario y la password.

Tu estás accediendo a través de un atajo por OLE. Desconozco si al crear el objeto con OLE, se podrian incluir otros parámetros ademas de "winhttp.winhttprequest.5.1". Pero en FiveWin, tiene la clase Wininet, con una serie de funciones en "C" que creo pueden permitirte hacer lo que quieres.

Re: Autenticacion user/password en una web

PostPosted: Mon Jun 14, 2010 9:11 pm
by JmGarcia
Haciendo una prueba con este foro (es como el de Meteo, php) por ejemplo el navegador envia estos datos:
POST /ucp.php?mode=login HTTP/1.1
.../...
Cookie: style_cookie=printonly; phpbb3_r8ok8_u=1; phpbb3_r8ok8_k=; phpbb3_r8ok8_sid=795a022cd288???????????c770ba438
.../...
Content-Length: 103
username=USUARIO&password=CONTRASEÑA&redirect=index.php&sid=795a022cd???????????fc770ba438&login=Login


...eso es lo que tengo que tratar de reproducir ¿no?.

Re: Autenticacion user/password en una web

PostPosted: Tue Jun 15, 2010 1:21 pm
by Carlos Mora
Exacto!
Como ves, esas cookies son propias de cada sitio que visitas, y meteo tendrá las suyas. Tendrías que analizar el momento en el que te logueas a Meteo (o lo que sea) a Ver que envía.
El login es un formulario, que en web puede enviar los datos (básicamente) en formato POST o GET. Como respuesta obtendrás una dirección nueva que almacenará una cookies (por cuestiones de seguridad la cookie de sesión cambia antes y despues de loguearte). Luego de obtener la cookie, en las sucesivas consultas tienes que enviar la cookie así el sitio sabrá que eres tú, que estás logueado, y te enviará los datos completos.

Ampliando un poquito lo que aporta Manuel, otra alternativa a Winhttp sería usar CURL, que es universal y que está en los contribs de Harbour. No le he usado con Harbour, pero es la librería 'canónica' para trastear con la web.

Un saludo

Re: Autenticacion user/password en una web

PostPosted: Wed Jun 16, 2010 12:02 pm
by Manuel Valdenebro
Carlos Mora wrote:Ampliando un poquito lo que aporta Manuel, otra alternativa a Winhttp sería usar CURL, que es universal y que está en los contribs de Harbour. No le he usado con Harbour, pero es la librería 'canónica' para trastear con la web.


Carlos, yo uso xHarbour, pero me imagino que serán compatibles. ¿Donde puedo bajar esa contribución? ¿Están las fuentes?.

Re: Autenticacion user/password en una web

PostPosted: Thu Jun 17, 2010 3:08 pm
by Carlos Mora
Hola Manuel,

está en los contribs

http://harbour-project.svn.sourceforge. ... ib/hbcurl/

Un saludo

Re: Autenticacion user/password en una web

PostPosted: Sun Jun 20, 2010 11:19 am
by Manuel Valdenebro
Carlos Mora wrote:Hola Manuel,

está en los contribs

http://harbour-project.svn.sourceforge. ... ib/hbcurl/

Un saludo


Muchas gracias Carlos.

Re: Autenticacion user/password en una web

PostPosted: Sat Nov 30, 2013 6:55 pm
by JmGarcia
Bueno, pues he conseguido resolver el problema ImageImage

El tema era la "autentificación básica" en mi caso.

Os dejo enlaces de interés:
El método "WinHttpRequest object"
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384106(v=vs.85).aspx
El método "SetRequestHeader"
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384060(v=vs.85).aspx
Introducción a la autenticación HTTP
http://msdn.microsoft.com/es-es/library/ms789031(v=vs.110).aspx

Autenticación básica:
La autenticación básica envía una cadena codificada por Base64 que contiene un nombre de usuario y contraseña para el cliente. Base64 no es una forma de cifrado y debe considerarse igual que enviar el nombre de usuario y contraseña en texto no cifrado. Si un recurso necesita ser protegido, considere fervientemente utilizar un esquema de autenticación distinto de la autenticación básica.


El método a usar es "setRequestHeader" que añade un encabezado HTTP y aquí os dejo mi parte de código:
Code: Select all  Expand view
oHttp:=CreateObject("winhttp.winhttprequest.5.1")
oHttp:SetTimeouts(30000,30000,30000,30000)
oHttp:Open("GET",cUrl,.F.)
oHttp:SetRequestHeader("Authorization","Basic dXNlcjpwYXNzd29yZA==") // BASE64 de "user:password"
oHttp:SetRequestHeader("Credentials","user:password")
oHttp:Send()
cPaginaHTML:=oHttp:ResponseText

Image