Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Intento de Post con usuario y contraseña sin saber la url de login (https://www.clubdelphi.com/foros/showthread.php?t=93990)

guspx 10-06-2019 20:35:48

Intento de Post con usuario y contraseña sin saber la url de login
 
Hola, estoy intentando acceder a una web con mi nombre de usuario y contraseña usando TIdhttp.Post y creo que usa autenticación Web, pero no estoy seguro porque examinando el código HTML en chrome no aparece ninguna entrada de la forma

Código:

<form method="post" action="url"
Es la web de un periódico que ha implantado suscripción hace muy poco, y lo que me temo es que oculta de alguna forma esos datos, y no sé lo suficiente de este tema para saber si los navegadores los obtienen mediante algún código javascript o como lo hacen, o simplemente es que no usa el procedimiento post y lo hace haciendo get, pero me extrañaría mucho.

Mi código es:

Código:

function Login: string;
var
    Request: TStringList;
    IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
begin
    Result := '';
    IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(self);
    try
        Request := TStringList.Create;
        try
            Request.Add('username=miusername');
            Request.Add('password=mipassword');
            Request.Add('remember=1');
            Request.Add('remember=true'); // hay una casilla de verificación con ese "name" y no se si ponerle 1 o  true
            IDHttp1.IOHandler:= IdSSLIOHandlerSocket;
            IdHTTP1.AllowCookies := True;
            IdHTTP1.HandleRedirects := True;
            IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
            IdHTTP1.Request.Connection := 'keep-alive';
            Result := IdHTTP1.Post({url donde está físicamente el botón de submit}, Request);
        finally
            Request.Free;
        end;
    except
        on E: Exception do ShowMessage(E.Message);
    end;
end;

En el retorno del Post tengo el mismo código HTML que puedo ver en chrome en la página del login.
En Idhttp1.Response.RawHeaders.Text puedo ver que la conexión está cerrada, así que no ha funcionado lo de keep-alive y no hay ninguna cookie, por lo que no hago el login realmente.
Supongo que lo que está mal es que la url que tengo que poner en la instrucción Post no es esa, y sería la que en casi todos los ejemplos que he visto la que vendría en <form action, de haber alguna en el código fuente, pero ya digo que no hay.

Entonces, ¿alguna idea de cómo puedo obtener esa url? Se supone que en algún sitio tiene que estar, para que los navegadores vayan allí, a no ser que los navegadores en sí sean los que se encargan de ocultarla por algún convenio que haya por ahí extraño. Muchas gracias por cualquier idea, si acaso puedo mandar la url por mp.

tsk 11-06-2019 15:42:17

Sin ver la página me puedo imaginar que el front-end está hecho ya sea con Angular o React. Y pues la mayoría está hecho en javascript.

Entonces, si haces un simple "Ver código fuente" te vas a topar con algo parecido a


Código PHP:

<!doctype html>
<
html lang="en">
<
head>
  <
meta charset="utf-8">
  <
title>Todo List</title>
  <
base href="/">

  <
meta name="viewport" content="width=device-width, initial-scale=1">
  <
link rel="icon" type="image/x-icon" href="favicon.ico">
<
link rel="stylesheet" href="styles.fd5a66b8129deb426b66.css"></head>
<
body>
  <
app-root></app-root>
<
script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="es2015-polyfills.bda95d5896422d031328.js" nomodule></script><script type="text/javascript" src="polyfills.8bbb231b43165d65d357.js"></script><script type="text/javascript" src="main.cf9b53bb05fc8927a7d8.js"></script></body>
</html> 


En Chrome, con las herramientas de desarrollador puedes inspeccionar, pero aún así no vas a obtener mucha más información

Código PHP:

<form _ngcontent-mhg-c3="" class="form ng-untouched ng-pristine ng-valid" novalidate="">
<
input _ngcontent-mhg-c3="" name="title" placeholder="Add Todo..." type="text" class="ng-untouched ng-pristine ng-valid">
<
input _ngcontent-mhg-c3="" class="btn" type="submit" value="Submit">
</
form


En el caso de angular, esa forma lo genera del siguiente código


Código PHP:

<form class="form" (ngSubmit)="onSubmit()">
    <
input type="text" name="title" [(ngModel)]="title" placeholder="Add Todo...">
    <
input type="submit" value="Submit" class="btn">
</
form


La forma en que podrías ver, con las mismas herramientas de desarrollador, es observando en el tab que se llama Network




Ya que sabes cual es la URL, podrías buscarla en las fuentes de javascript, por ejemplo, en este caso se encuentra en main.XXXXXXXXXXX.js

Código PHP:

this.todosUrl="https://jsonplaceholder.typicode.com/todos 

Y la función addTodo la verías como

Código PHP:

t.prototype.addTodo=function(t){return this.http.post(this.todosUrl,t,vf)} 

donde

t son los datos que vienen de la forma y vf son las opciones, por ejemplo

Código PHP:

vf={headers:new Uh({"Content-Type":"application/json"})} 

Lo de arriba, en el código fuente original lo verías como (Angular)

Código PHP:

 addTodo(todo:Todo):Observable<Todo>{
    const 
url = `${this.todosUrl}/${todo.id}`;
    return 
this.http.post<Todo>(this.todosUrltodohttpOptions);
  } 

y

Código PHP:

const httpOptions = {
  
headers: new HttpHeaders({
    
'Content-Type''application/json'
  
}) 


guspx 12-06-2019 06:24:19

Muchísimas gracias, en la pestaña Headers de Network he podido ver que en realidad el procedimiento es GET y la url es la misma. Me guardo tu utilísimo post para el futuro. Saludos.


La franja horaria es GMT +2. Ahora son las 21:17:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi