Ir al contenido


Foto

[MULTILENGUAJE] Pedir autentificación en un proxy


  • Por favor identifícate para responder
4 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 15 marzo 2012 - 10:13

Como complemento al truco publicado, " Autentificarnos en un proxy", pedemos pedir la autentificación, de esta forma obligamos a que el usuario se sepa la contraseña.

La función en C/C++ sería esta:


cpp
  1. #pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib"
  2.  
  3. void Authenticate(HWND hWnd, char *URL)
  4. {
  5.   HINTERNET hInet,  hConnect, hRequest;
  6.   DWORD dwErrorCode;
  7.  
  8.   char *URL = strnewdup(_URL);
  9.   if(!strnicmp(URL, "http://", 7)) URL += 7;
  10.   char *C = strchr(URL, '//');
  11.   if(C) *C = 0;
  12.   hInet = InternetOpen("Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  13.   hConnect = InternetConnect(hInet, URL,
  14.                               INTERNET_INVALID_PORT_NUMBER, NULL, NULL,
  15.                               INTERNET_SERVICE_HTTP, 0,0);
  16.  
  17.   hRequest = HttpOpenRequest(hConnect, "GET", "", NULL, NULL, NULL,
  18.                               INTERNET_FLAG_KEEP_CONNECTION, 0);
  19.   HttpSendRequest(hRequest, NULL, 0, NULL, 0);
  20.   dwErrorCode = hRequest ? ERROR_SUCCESS : GetLastError();
  21.   InternetErrorDlg(hWnd, hRequest, dwErrorCode,
  22.                     FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
  23.                     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS |
  24.                     FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
  25.                     NULL);
  26.   delete URL;
  27.   InternetCloseHandle(hInet);
  28.   InternetCloseHandle(hConnect);
  29.   InternetCloseHandle(hRequest);
  30. }


hWnd: Es la ventana padre del cuadro de dialogo de autentificación.
URL: Es una URL completa y válida.

Obtendremos un diálogo que nos pedirá autentificarnos. Una vez autenrificados, la autentificación persiste durante toda la vida de la aplicación.

Eljemplo de uso:

cpp
  1.   Authenticate(Handle, "http://www.google.es");


En el siguiente mensaje publico una versión para delphi.  :)

Espero que sea de utilidad.



Saludos.

PD: Actualizo el código para admitir direcciones IP
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 15 marzo 2012 - 10:20

La versión delphi es idéntica a la versión C/C++, sólo le cambio el nombre para no tener conflicto con la función publicada aquí.
 


delphi
  1. uses Wininet;
  2.  
  3. procedure Authenticate2(hWnd: THANDLE; URL: String);
  4. var
  5.   hInet, hConnect, hRequest: HINTERNET;
  6.   dwErrorCode, i: DWORD;
  7. begin
  8.   URL:= StrLower(PCHAR(URL));
  9.   i:= Pos('http://', URL); if i>0 then URL:= Copy(URL, 8, Length(URL)-7);
  10.   i:= Pos('/', URL);      if i>0 then SetLength(URL, i-1);
  11.   hInet:= InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  12.   hConnect:= InternetConnect(hInet, PCHAR(URL),
  13.                               INTERNET_INVALID_PORT_NUMBER, nil, nil,
  14.                               INTERNET_SERVICE_HTTP, 0,0);
  15.  
  16.   hRequest:= HttpOpenRequest(hConnect, 'GET', '',
  17.                               nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
  18.  
  19.   HttpSendRequest(hRequest, nil, 0, nil, 0);
  20.   if hRequest<>nil then dwErrorCode:= ERROR_SUCCESS else dwErrorCode:= GetLastError;
  21.   InternetErrorDlg(hWnd, hRequest, dwErrorCode,
  22.                     FLAGS_ERROR_UI_FILTER_FOR_ERRORS or
  23.                     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS or
  24.                     FLAGS_ERROR_UI_FLAGS_GENERATE_DATA,
  25.                     PPointer(0)^);
  26.  
  27.   InternetCloseHandle(hInet);
  28.   InternetCloseHandle(hConnect);
  29.   InternetCloseHandle(hRequest);

El uso es igual que su hermana en C/C++:


delphi
  1.   Authenticate(Handle, 'http;//www.google.es');  // En el ejemplo sustituir http; por http:

Espero que sea de utilidad.


Saludos.


PD: Actualizo el código para admitir direcciones IP


  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 15 marzo 2012 - 10:24

Excelente solución amigo escafandra, ultimamente he tenido que incluir autenticación a proxy y lo he hecho con curl, ésta es otra forma pero indudablemente muy interesante. (y)

Saludos
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 15 marzo 2012 - 10:34

En el anterior truco también nos autentificábamos aunque era la aplicación la que lo hacía conociendo de antemano las credenciales. Bien es cierto que podíamos crear un diálogo que nos pidiera el user y password.

En este truco obligamos al S.O. que nos lo pida. Este truco es de utilidad si deseamos que el usuario deba conocer las credenciales.


Saludos.


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 21 marzo 2012 - 08:56

En el hilo que originó este truco se precisó que la dirección para autentificarse en el proxy fuera una IP. Por ese motivo actualizo el código original, para que admita direcciones IP.

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.