Autenticação via Socket (protocolo HTTP)

Bom dia à todos,

Alguém teria algum exemplo de uma autenticação em algum site utilizando o protocolo HTTP?

Estou usando os métodos GET e POST via SSLSocket.

Consigo conectar e enviar o primeiro pacote com o comando:

GET / HTTP/1.0

Ele me retorna o status de OK.

Mas apartir deste momento, não estou mais conseguindo evoluir.

Agradeço se puder me ajudar.

Abraços!

Amigo,

Depende do servidor, mas geralmente você precisa pegar o cookie.
O servidor irá mandar o cookie, provavelmente (Set-Cookie:) e depois você passa Cookie: e o número do cookie.

ex (escrevi um robo em C que faz isso pro VOL):

/* Esta funcao obtem um header http */
char * obterHeaderHttp(char * servidorConexao, char * cookie) {
 
    /* Vamos usar um buffer grande (2kb nao tem perigo de estourar) */
    char * headerHttp = (char *) malloc(sizeof(char) * 2048);
    if (headerHttp == NULL) {
        printf("Falta de memoria.\n");
        exit(-1);
    }
    strcpy(headerHttp, "Host: ");
    strcat(headerHttp, servidorConexao);
    strcat(headerHttp, "\n");
    strcat(headerHttp, "User-Agent: Mozilla/5.0 ");
    strcat(headerHttp, "X11; U; Linux i686; en-US; rv:1.8.1.14)\n");
    strcat(headerHttp, "Accept: text/xml,text/html;q=0.9,text/plain;");
    strcat(headerHttp, "q=0.8,image/png,*/*;q=0.5\n");
    strcat(headerHttp, "Accept-Language: en-us,en;q=0.5\n");
    strcat(headerHttp, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n");
    strcat(headerHttp, "Keep-Alive: 300\n");
    if (cookie != NULL) {
        strcat(headerHttp, "Cookie: ");
        strcat(headerHttp, cookie);
        strcat(headerHttp, ";\n");
    }
    strcat(headerHttp, "Connection: keep-alive\n");
    headerHttp[strlen(headerHttp)] = 0;
    return headerHttp;
}

Veja no link:
http://www.vivaolinux.com.br/script/Robo-HTTP-usando-socket-e-codigo-multiplataforma

A lógica é a mesma…

veja se isto te ajuda:

http://www.java2s.com/Code/Java/Apache-Common/Http-Client.htm

estes exemplos usam o apache HttpClient http://hc.apache.org/httpclient-3.x/

jmmenezes e luistiagos, valeu pelas respostas.

Mas o que estou querendo é implementar o protocolo HTTP.

Ou seja, vou trocar mensagens via Socket com o servidor HTTP.

O que preciso é entender realmente como são montados os métodos GET e POST do protocolo.
Porque hoje já consigo receber através do comando GET /html/identificacao.html HTTP/1.0 a página de LOGIN.
O que preciso agora é saber como monto o meu POST enviando o USUÁRIO e SENHA para autenticar.
Sabendo montá-lo, apenas envio via Socket para o servidor HTTP e acredito que já saia funcionando.

Estou viajando ou é por este caminho?

Abraço!

Cara, o protocolo HTTP é bem extenso, uma coisa te digo, não é de pergunta em pergunta no fórum que você vai conseguir implementá-lo. Nesses casos nada melhor do que ir direto à fonte:

http://www.w3.org/Protocols/rfc2616/rfc2616.html

Uma outra abordagem é fazer as requisições na mão através de um navegador executando o Firebug por exemplo. Assim você consegue debugar as requsições HTTP e você consegue olhar o formato das requisições e respostas.

Amigo,

O código que te passei faz exatamente isso… e se só precisa do login, não precisa aprender o HTTP inteiro acredito eu…
fiz esse código muito tempo atras e adaptei quando um cara teve duvida no vivaolinux e resolvi adaptar e mandar como artigo para lá.

O detalhe que fiz em C, porém a logica é a mesma, basta fazer em java sem se preocupar com ponteiros ou tratamentos especificos do C, ou seja, mais facil.
Você vai fazer:
1 - Precisa pegar o cookie, basta pegar a página de login e ele vai te mandar o cookie em setcookie (veja o método obterCookie())
2 - Depois você monta o form (separando os parâmetros que ele precisa com &) e manda para a página de login novamente com o mesmo cookie
3 - Você terá de mandar o cookie para as páginas que precisam de autenticação.

Como falei, a maior parte do controle de sessão funciona desta forma, mas o site poderá implementar de formas diferentes, ai precisaria depurar a comunicação com algum sniffer tipo o wireshark ou até mesmo pelo Firebug.

Segue o código completo, a implementação em C:

/**
 * rankvol.c
 *
 * Neste programa iremos conectar com um servidor web,
 * obter o cookie e entao com este cookie obter novos
 * dados do servidor.
 *
 * Iremos utilizar o VOL como exemplo.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
 
#ifdef WIN32
    #include <windows.h>
    #include <winsock.h>
    #include <conio.h>
#else
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <termios.h>
#endif
 
#ifdef WIN32
    #define FILE_SEPARATOR ''
    #define MSG_WAITALL 0
    #define CHAR_ENTER 13
#else
    #define FILE_SEPARATOR '/'
    #define CHAR_ENTER 10
#endif
 
#ifndef TCP_NODELAY
    #define TCP_NODELAY 1
#endif
 
/* Aqui iremos declarar algumas variaveis globais */
static char servidor[] = "www.vivaolinux.com.br";
static char scriptLogin[] = "/testarLogin.php";
static char scriptHome[] = "/index.php";
 
/* Porta HTTP do servidor */
static int portaServidor = 80;
 
/* Iremos armazenar aqui o login e a senha */
char login[17];
char senha[101];
 
/* Vamos lidar com buffer de 1Kb (1024 bytes) e mais
um byte para o armazenamento do null */
char buffer[1025];
 
/* Vamos utilizar buffer de 32Kb para o pacote de subida */
#define BUF_32KB 32768
#define BUF_32KB_WORK 32767
char bufEnvio[BUF_32KB];
 
/* Prototipos */
int abrirConexao(char * servidorConexao, int portaConexao);
char * obterHeaderHttp(char * servidorConexao, char * cookie);
void enviarDados(int socket, char * buffer);
char * receberDados(int socket);
char * obterPagina(char * script, char * dadosForm, char * cookie);
char * obterCookie();
int efetuarLogin(char * login, char * senha, char * cookie);
long obterRanking(char * cookie);
 
/* Esta funcao le um caractere. Veio de uma dica na net,
mas fiz algumas modificacoes :P
Para evitar o uso de ncurses esse e o jeito de usar algo tipo o getch
No windows deveremos usar o famoso conio.he o proprio getch */
int lerCarac() {
    int chLido;
    #ifdef WIN32
        chLido = getch();
    #else
        struct termios oldt, newt;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        chLido = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    #endif
    return chLido;
}
 
/* Entrada do programa */
main(int argc, char *argv[])
{
    /* Entrada de dados */
    printf("\nHTTP-Robot - Exemplo de Robo HTTP - Mostra ranking no VOL:\n\n");
    printf("Entre com o login do VOL: ");
 
    /* O fgets ja coloca um null na ultima posicao automaticamente */
    /* Assim tambem evitamos buffer overflow :P */
    fgets(login, 17, stdin);
 
    /* Remover o enter, aproveitamos e colocamos um final de string */
    if (login[strlen(login) - 1] == 10) {
        login[strlen(login)-1] = 0;
    } else {
        login[strlen(login)] = 0;
    }
 
    /* Agora vamos ler a senha */
    printf("Entre com a senha do VOL: ");
    char chLido = 0;
    while (chLido != CHAR_ENTER && strlen(senha) < 101) {
        chLido = lerCarac();
        if (chLido > 27) {
            /* Caracter lido e asterisco na tela */
            putchar(42);
            fflush(stdout);
            senha[strlen(senha)] = chLido;
        }
    }
 
    /* Forca finalizacao da string da senha */
    senha[strlen(senha)] = 0;
    printf("\n");
 
    /* Precisamos obter o cookie */
    char * cookie = obterCookie();
    printf("Cookie de sessao obtido: [%s]\n", cookie);
 
    /* Vamos enviar os dados do login */
    if (!efetuarLogin(login, senha, cookie)) {
        printf("Nao foi possivel efetuar o login.\n");
        printf("Verifique se o login e senha estao corretos.\n");
        exit(-1);
    } else {
        printf("Login efetuado com sucesso.\n");
    }
 
    /* Agora vamos obter o ranking */
    long ranking = obterRanking(cookie);
    if (ranking == 0) {
        printf("Ranking nao localizado. \n");
        printf("Verifique se o layout da home do vol foi modificado.\n");
    } else {
        printf("Seu ranking no VOL e: %d\n", ranking);
    }
 
    /* E nao podemos esquecer de liberar da memoria */
    if (cookie != NULL) {
        free(cookie);
    }
 
    /* Se chegar aqui e pq tudo deu certo */
    printf("Programa finalizado com sucesso.\n");
    return 0;
}
 
/* Rotina para obter o cookie da sessao */
char * obterCookie() {
 
    /*
        Primeiro precisamos do cookie
        Vamos obte-lo chamando a index.php e pegando o Set-Cookie
        */
    printf("\nAcessando home e obtendo cookie de sessao ...\n");
    char * dadosHome = obterPagina(scriptHome, NULL, NULL);
    char * posCookieIni = strstr(dadosHome, "Set-Cookie: ");
    if (posCookieIni == NULL) {
        printf("Erro ao obter o cookie. Pode ser problema de conexao.\n");
        exit(-1);
    }
    char * posCookieFim = strstr(posCookieIni + 12, ";");
    if (posCookieFim == NULL) {
        printf("Erro ao obter o cookie. Pode ser problema de conexao.\n");
        exit(-1);
    }
    char * cookie = (char *) malloc(sizeof(char) * 2048);
    if (cookie == NULL) {
        printf("Falta de memoria.\n");
        exit(-1);
    }
    int tamanho = strlen(posCookieIni) - strlen(posCookieFim) - 12;
    strncpy(cookie, posCookieIni + 12, tamanho);
    cookie[tamanho] = 0;
 
    /* Nao precisamos mais dos dados da home */
    /* Automaticamente estaremos limpando posCookieIni e posCokieFim */
    if (dadosHome != NULL) {
        free(dadosHome);
    }
    return cookie;
 
}
 
/* Para efetuar login no VOL */
int efetuarLogin(char * login, char * senha, char * cookie) {
 
    printf("Efetuando login no VOL ...\n");
    int resLogin = 0;
 
    /* 2Kb sao suficientes para os dados do form */
    char * dadosForm = (char *) malloc(sizeof(char) * 2048);
    if (dadosForm == NULL) {
        printf("Falta de memoria.");
        exit(-1);
    }
 
    if ((strlen(login) + strlen(senha) + 87) > BUF_32KB_WORK) {
        printf("Erro de estouro de buffer.\n");
        exit(-1);
    }
    sprintf(dadosForm, "referer=index.php&formLogin=%s&formSenha=%s",
            login, senha);
 
    /* Botoes do form */
    strcat(dadosForm, "&imageField2.x=0&imageField2.y=0&Submit=Entrar\n");
    char * dadosRecebidos = obterPagina(scriptLogin, dadosForm, cookie);
 
    /* Vamos tentar identificar o login atraves de 2 informacoes:
        1-O vol retorna um HTTP/1.1 302 Found para redirecionar
          para a home quando o login esta ok
        2-Ele retorna um Location: no header
        3-Verificamos ainda o acesso negado (pagina login) */
    char * tmpBufHttp = strstr(dadosRecebidos, "302 Found");
    if (tmpBufHttp != NULL) {
        char * tmpBufLocation = strstr(dadosRecebidos, "Location:");
        if (tmpBufLocation != NULL) {
            /* Se ele encontrar as 2 strings vamos considerar que houve
               autenticacao com sucesso */
            if ((strlen(tmpBufHttp) < strlen(dadosRecebidos))
                    && (strlen(tmpBufLocation) < strlen(dadosRecebidos))) {
                /* Mas antes vamos procurar por acesso restrito para verificar
                   se nao mudaram a regra */
                char * tmpBufAcesso = strstr(dadosRecebidos, "acesso restrito");
                if (tmpBufAcesso == NULL) {
                    resLogin = 1;
                }
            }
        }
    }
 
    /* Vamos limpar da memoria */
    if (dadosForm != NULL) {
        free(dadosForm);
    }
    if (dadosRecebidos != NULL) {
        /* Ao limpar dadosRecebidos estaremos limpando tmpBufHttp
           e tmpBufLocation */
        free(dadosRecebidos);
    }
    return resLogin;
 
}
 
/* Apos autenticado, obtem o ranking mostrado na home do VOL */
long obterRanking(char * cookie) {
 
    /* Vamos obter a home */
    printf("Obtendo ranking a partir da home ...\n");
    long ranking = 0;
    char * dadosHome = obterPagina(scriptHome, NULL, cookie);
 
    char * posRank = strstr(dadosHome, "Ranking: <b>");
    if (posRank != NULL) {
        char * posFimRank = strstr(posRank, "</b>");
        if (posFimRank != NULL) {
            // Temos de tirar o ranking e o deg
            int tamRank = strlen(posRank) - strlen(posFimRank) - 17;
            if (tamRank > 0) {
                char * tmpRank = (char *) malloc(sizeof(char) * (tamRank + 1));
                if (tmpRank == NULL) {
                    printf("Falta de memoria.\n");
                    exit(-1);
                }
                strncpy(tmpRank, posRank + 12, tamRank);
                tmpRank[tamRank] = 0;
 
                /* Agora devemos converter para long
                   e depois limpar da memoria */
                ranking = strtol(tmpRank, NULL, 10);
                if (tmpRank != NULL) {
                    free(tmpRank);
                }
            }
        }
    }
 
    /* Nao precisamos mais dos dados da home */
    /* Automaticamente estaremos limpando posRank e posFimRank */
    if (dadosHome != NULL) {
        free(dadosHome);
    }
    return ranking;
}
 
/* Funcao para conectar no host */
int abrirConexao(char * servidorConexao, int portaConexao) {
    #ifdef WIN32
        WSADATA wsaData;
        WORD wVersionRequested;
        int err;
 
        wVersionRequested = MAKEWORD(2, 0);
        err = WSAStartup(wVersionRequested, &wsaData);
        if (err != 0) {
            fprintf(stderr, "Nao achou WinSock DLL.\n");
            exit(-1);
        }
    #endif
 
    int meuSocket;
    struct sockaddr_in sockAddr;
    struct hostent *hEnt;
 
    /* Vamos obter os dados do host */
    hEnt = gethostbyname(servidorConexao);
    if (hEnt == NULL) {
        printf("Erro ao obter os dados do host.\n");
        exit(-1);
    }
 
    /* Agora vamos obter o socket */
    meuSocket = socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
    if (meuSocket == -1) {
        printf("Erro ao obter socket tcp.\n");
        exit(-1);
    }
 
    /* Vamos definir o TCP_NODELAY (usado para comunicacoes de ida e
       volta para melhorar a performance)  */
    int flagTcpNoDelay = 1;
    int resTcpNoDelay = setsockopt(meuSocket, IPPROTO_TCP, TCP_NODELAY,
        (char *) &flagTcpNoDelay, sizeof(int));
    if (resTcpNoDelay < 0) {
        printf("Erro ao setar tcp_nodelay.\n");
        exit(-1);
    }
     
    /* Vamos definir tambem o timeout do socket
       (Voce pode precisar mudar em redes lentas) */
    struct timeval tv;
    int timeouts = 0;
    tv.tv_sec = 3;
    tv.tv_usec = 0;
    if (setsockopt(meuSocket, SOL_SOCKET, SO_RCVTIMEO,
            (char *) &tv, sizeof tv)) {
        printf("Erro ao definir timeout.");
        exit(-1);
    }
 
    /* Entao conectamos */
    memcpy(&sockAddr.sin_addr, hEnt->h_addr, hEnt->h_length);
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(portaConexao);
    if (connect(meuSocket, (struct sockaddr *) &sockAddr,
            sizeof(sockAddr)) < 0) {
        printf("Erro ao conectar no servidor.\n");
        exit(-1);
    }
 
    /* E voltamos o socket conectado */
    return meuSocket;
}
 
/* Esta funcao obtem um header http */
char * obterHeaderHttp(char * servidorConexao, char * cookie) {
 
    /* Vamos usar um buffer grande (2kb nao tem perigo de estourar) */
    char * headerHttp = (char *) malloc(sizeof(char) * 2048);
    if (headerHttp == NULL) {
        printf("Falta de memoria.\n");
        exit(-1);
    }
    strcpy(headerHttp, "Host: ");
    strcat(headerHttp, servidorConexao);
    strcat(headerHttp, "\n");
    strcat(headerHttp, "User-Agent: Mozilla/5.0 ");
    strcat(headerHttp, "X11; U; Linux i686; en-US; rv:1.8.1.14)\n");
    strcat(headerHttp, "Accept: text/xml,text/html;q=0.9,text/plain;");
    strcat(headerHttp, "q=0.8,image/png,*/*;q=0.5\n");
    strcat(headerHttp, "Accept-Language: en-us,en;q=0.5\n");
    strcat(headerHttp, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n");
    strcat(headerHttp, "Keep-Alive: 300\n");
    if (cookie != NULL) {
        strcat(headerHttp, "Cookie: ");
        strcat(headerHttp, cookie);
        strcat(headerHttp, ";\n");
    }
    strcat(headerHttp, "Connection: keep-alive\n");
    headerHttp[strlen(headerHttp)] = 0;
    return headerHttp;
}
 
/* Funcao para enviar dados via socket */
void enviarDados(int socket, char * buffer) {
    int envio = send(socket, buffer, strlen(buffer), 0);
    if (envio < 1) {
        printf("Erro no envio dos dados: [%d].\n", envio);
        exit(-1);
    }
}
 
/* Funcao para receber dados via socket.
Vamos trabalhar com alocacao dinamica.
Esta funcao retorna um ponteiro para os dados recebidos
*/
char * receberDados(int socket) {
    char * dados = (char *) malloc(sizeof(char) * 1025);
    if (dados == NULL) {
        printf("Falta de memoria.\n");
        exit(-1);
    }
    int contBuf = 0;
    while ((contBuf = recv(socket, buffer, 1024, 0)) > 0) {
        /* Para mostrar que esta recebendo alguma coisa */
        putchar(42);
        fflush(stdout);
 
        /* Adiciona ao buffer se possivel */
        buffer[contBuf] = 0;
                 
        if (dados == NULL) {
            strcpy(dados, buffer);
        } else {
            /* Realocamos mais 1kb */
            dados = realloc(dados, strlen(dados) + 1025);
            if (dados == NULL) {
                printf("Erro na realocacao dinamica.\n");
                exit(-1);
            }
            strcat(dados, buffer);
        }    
 
        /* Limpar buffer */
        int n = 0;        
        for(n = 0; n <= 1024; n++) {
            buffer[n] = 0;
        }
    }
    dados[strlen(dados)] = 0;
    return dados;
}
 
/* Obtem os dados de uma pagina html */
char * obterPagina(char * script, char * dadosForm, char * cookie) {
 
    int meuSocket;
    printf("Conectando: (%s) ... \n", servidor);
    meuSocket = abrirConexao(servidor, portaServidor);
    if (meuSocket == -1) {
        printf("Erro ao conectar no servidor.\n");
        exit(-1);
    }
 
    /* Vamos obter o header */
    char * headerHttp = obterHeaderHttp(servidor, cookie);
 
    /* Vamos gerar o post de envio */
    if (dadosForm == NULL) {
        sprintf(bufEnvio, "GET %s HTTP/1.1\n", script);
    } else {
        sprintf(bufEnvio, "POST %s HTTP/1.1\n", script);
    }
    if ((strlen(bufEnvio) + strlen(headerHttp)) > BUF_32KB_WORK) {
        printf("Erro de estouro de buffer.\n");
        exit(-1);
    }
    strcat(bufEnvio, headerHttp);
     
    /* Vamos limpar da memoria */    
    if (headerHttp != NULL) {
        free(headerHttp);
    }    
 
    /* Temos de adicionar algumas informacoes para mandar o form */
    if (dadosForm != NULL) {
        if ((strlen(bufEnvio) + 64) > BUF_32KB_WORK) {
            printf("Erro de estouro de buffer.\n");
            exit(-1);
        }
        strcat(bufEnvio, "Content-Type: application/x-www-form-urlencoded\n");
 
        strcat(bufEnvio, "Content-Length: ");
        char * tmpBuf = (char *) malloc(sizeof(char) * 1024);
        if (tmpBuf == NULL) {
            printf("Falta de memoria.\n");
            exit(-1);
        }
        sprintf(tmpBuf, "%d", strlen(dadosForm));
        if ((strlen(bufEnvio) + strlen(tmpBuf) + 2) > BUF_32KB_WORK) {
            printf("Erro de estouro de buffer.\n");
            exit(-1);
        }
        strcat(bufEnvio, tmpBuf);
        strcat(bufEnvio, "\n");
        if (tmpBuf != NULL) {
            free(tmpBuf);
        }
    }
    strcat(bufEnvio, "\n");
 
    /* Armazena os dados do form */
    if (dadosForm != NULL) {
        if ((strlen(bufEnvio) + strlen(dadosForm)) > BUF_32KB_WORK) {
            printf("Erro de estouro de buffer.\n");
            exit(-1);
        }
        strcat(bufEnvio, dadosForm);
    }
 
    /* Envia os dados */
    enviarDados(meuSocket, bufEnvio);
    printf("Dados foram enviados, recebendo dados ...\n");
    char * dadosRecebidos = receberDados(meuSocket);  
    #ifdef WIN32
        closesocket(meuSocket);
        WSACleanup();
    #else
        close(meuSocket);
    #endif
    printf("\n");
 
    return dadosRecebidos;
}

Eu recomendaria usar o HTTPClient que foi citado pelo amigo luistiagos.
É bem mais simples…

A não ser que queira usar o HTTP puro mesmo ai deve seguir o que fiz em C…

Entendi jmmenezes.

Então vou postar aqui o meu código para ver se vocês identificam algum problema.

			// Realiza a conexão SSL com o servidor HTTP.
			SSLSocket
			lo_socket		=	(SSLSocket) SSLSocketFactory.getDefault().createSocket("www.exemplo.com.br", 443);
			
			// Faz o handShake para autenticação.
			lo_socket.startHandshake();
			
			// Cria o canal de saída com o servidor HTTP.
			PrintWriter
			lo_writer		=	new PrintWriter(new BufferedWriter(new OutputStreamWriter(lo_socket.getOutputStream())));
			
			// Para enviar a mensagem precisa ter um CR_LF, uma linha em branco e um CR_LF novamente.
			lo_writer.println("GET /html/identificacao.html HTTP/1.0");
			lo_writer.println();
			lo_writer.flush();
			
			// Se comunicação fechada ou sinalizada em estado de erro...
			if	(lo_writer.checkError())
			{
				System.out.println("ERRO!!!");
			}
			
			// Cria o canal de entrada com o servidor HTTP.
			BufferedReader
			lo_reader		=	new BufferedReader(new InputStreamReader(lo_socket.getInputStream()));
			
			// Recupera cada linha enviada pelo servidor.
			String
			ls_receive		=	null;
			
			// Valor final da entrada.
			StringBuilder
			ls_receive_all		=	new StringBuilder();
			
			while	((ls_receive = lo_reader.readLine()) != null)
			{
				// Recebe o valor atual e concatena com uma quebra de linha.
				ls_receive_all.append(ls_receive+"\r\n");
			}
			
			System.out.println(ls_receive_all.toString());
			
			// Fecha a comunicação.
			lo_writer.close();
			lo_reader.close();
			lo_socket.close();

Com este código ele me retorna o form com os campos “Cliente” e “formPassword” refente ao usuário e login do site.

Apartir deste momento o que devo fazer?

Abraço!

Veja se em: ls_receive_all

Ele retorna o o setcookie??

Vou jogar o seu código aqui no eclipse e ver… te passo mais infos

Esqueci de falar na mensagem anterior: Não veio o setcookie na resposta do servidor.

Abaixo o que o servidor me respondeu (tirando o HTML):

HTTP/1.1 200 OK
Content-Length: 4758
Content-Type: text/html
Content-Location: https://10.0.64.9/html/identificacao.html
Last-Modified: Fri, 20 Aug 2010 13:48:15 GMT
Accept-Ranges: bytes
ETag: "1cddc1566e40cb1:187e"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 26 Apr 2012 14:46:48 GMT
Connection: close

Abraço!

Cara… como falei… nem sempre é cookie.
Neste caso ta mandando ETAG… nunca trabalhei assim…

Veja:
http://www.arctic.org/~dean/tracking-without-cookies.html

Da uma lida… vou tentar entender como funciona, mas não tenho nenhuma url aqui interna para testar dessa forma e não consigo usar o SSLSocket com conexão externa neste momento (estou atrás de um proxy).

EDIT:

Cara não sei se é isso não… talvez eu tenha falado besteira…
tenta fazer o POST na página de autenticação e veja se volta o Set-Cookie. Fiz um teste em um servidor IIS aqui e retornou isso.

Cara, então por favor, me passe o código novamente com as alterações que fizesse para funcionar neste servidor IIS?

Agradeço.

Abraço!

Amigo… consegui fazer de uma forma melhor, usando URLConnection, desta forma consegui passar pelo proxy… e o Set-Cookie veio…
Tenta ver se consegue.

OBS: Peguei o exemplo na net, coloque na url do google



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.SocketAddress;
import java.net.URL;
import java.security.cert.Certificate;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;


 
public class HttpsClient{
 
   public static void main(String[] args)
   {
        new HttpsClient().testIt();
   }
 
   private void testIt(){
 
	   SocketAddress socketAddress =
               new InetSocketAddress("127.0.0.1", 9666);
      String https_url = "https://www.google.com.br/";
      URL url;
      try {

 
	     url = new URL(https_url);
 
             // Conexão com e sem proxy
	     //HttpsURLConnection con = (HttpsURLConnection)url.openConnection(new Proxy(Type.HTTP, socketAddress));
            HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
 
	     //dumpl all cert info
	     print_https_cert(con);
 
	     //dump all the content
	     print_content(con);
 
      } catch (MalformedURLException e) {
	     e.printStackTrace();
      } catch (IOException e) {
	     e.printStackTrace();
      }
 
   }
 
   private void print_https_cert(HttpsURLConnection con){
 
    if(con!=null){
 
      try {
 
	System.out.println("Response Code : " + con.getResponseCode());
	System.out.println("Cipher Suite : " + con.getCipherSuite());
	System.out.println("\n");
 
	Certificate[] certs = con.getServerCertificates();
	for(Certificate cert : certs){
	   System.out.println("Cert Type : " + cert.getType());
	   System.out.println("Cert Hash Code : " + cert.hashCode());
	   System.out.println("Cert Public Key Algorithm : " + cert.getPublicKey().getAlgorithm());
	   System.out.println("Cert Public Key Format : " + cert.getPublicKey().getFormat());
	   System.out.println("\n");
	}
 
	} catch (SSLPeerUnverifiedException e) {
		e.printStackTrace();
	} catch (IOException e){
		e.printStackTrace();
	}
 
     }
 
   }
 
   private void print_content(HttpsURLConnection con){
	if(con!=null){
 
	try {
 
		Map<String, List<String>> headers = con.getHeaderFields();
		Iterator it = headers.entrySet().iterator();
	    while (it.hasNext()) {
	        Map.Entry pairs = (Map.Entry)it.next();
	        System.out.println(pairs.getKey() + " = " + pairs.getValue());
	    }		
		
	   System.out.println("****** Content of the URL ********");			
	   BufferedReader br = 
		new BufferedReader(
			new InputStreamReader(con.getInputStream()));
 
	   String input;
 
	   while ((input = br.readLine()) != null){
	      System.out.println(input);
	   }
	   br.close();
 
	} catch (IOException e) {
	   e.printStackTrace();
	}
 
       }
 
   }
 
}

Com o exemplo funcionou legal.

O site do Google trouxe o Set-Cookie porém o site que eu preciso logar não traz o Set-Cookie, traz somente o ETag.

E agora?

Abraço!

então cara…

Infelizmente não vou conseguir te ajudar, pois realmente nunca mexi com o ETAG… talvez se você chamasse a url de autenticação com o POST venha o Set-Cookie.

Veja estes links que encontrei:
http://www.hccp.org/java-net-cookie-how-to.html
http://www.jguru.com/forums/view.jsp?EID=771782

Abs

Beleza jmmenezes.

De qualquer forma agradeço a sua ajuda.

Preciso ler bastante sobre este protocolo para poder entendê-lo.

Vou deixar o tópico aberto para caso alguém tenha algum informação relevante, postá-la!

Abraço!

jmmenezes,

Quando vier o Set-Cookie como faço para passar o usuário e senha para a URL ?

Mesmo não funcionando no site que eu quero, vou fazer os testes em outros sites, assim pelo menos entendo a funcionalidade e depois eu estudo como utilizar a ETag.

Abraço!

Você pode passar assim:
Você coloca os parâmetros em uma string, neste caso estou colocando referer=index.php
Se tiver mais de um parâmetro concatena com &

Depois pegue o outputStream da conexão.

String data = URLEncoder.encode("referer", "UTF-8") + "=" + URLEncoder.encode("index.php", "UTF-8");
data += "&" + URLEncoder.encode("formLogin", "UTF-8") + "=" + URLEncoder.encode(usuario, "UTF-8");
data += "&" + URLEncoder.encode("formSenha", "UTF-8") + "=" + URLEncoder.encode(senha, "UTF-8");

 OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
	    wr.write(data);
	    wr.flush();

Se tiver novidades posto aqui… abs

Ao criar o OutputStreamWritter ele dá a seguinte exceção:

java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true)
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
	at comm.HTTP.print_content(HTTP.java:118)
	at comm.HTTP.testIt(HTTP.java:54)
	at comm.HTTP.main(HTTP.java:32)

Ele pede para chamar o método setDoOutput(true).
Quando chamo este método antes de criar o OutputStreamWriter, ele dá outra exceção:

Exception in thread "main" java.lang.IllegalStateException: Already connected
	at java.net.URLConnection.setDoOutput(Unknown Source)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.setDoOutput(Unknown Source)
	at comm.HTTP.print_content(HTTP.java:116)
	at comm.HTTP.testIt(HTTP.java:54)
	at comm.HTTP.main(HTTP.java:32)

Abraço!

o HttpClient da apache tem o código aberto e faz tudo isto que vc quer fazer, vc pode baixar a implementação dele e estuda-la.