Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 723 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Prezados estou com dificuldade para Autenticar minha aplicação Delphi 7 indy 10, componente idHttp, para consumir uma Api.

A Autenticação se dá em duas etapas, na primeira tentativa recebo o seguinte:

HTTP/1.1 401 Unauthorized\r\n
WWW-Authenticate: Digest realm="Login to 487e5a44454e904373ec5eb024fa2c69", qop="auth", nonce="1482119029", opaque="18f18dafed9183a0fe929d0d36756a2535547e51"\r\n
Connection: close\r\n
Set-Cookie:secure; HttpOnly\r\n
 

Através do wireshark, entendi que o sistema deve enviar como resposta o seguinte:

GET /cgi-bin/global.cgi?action=getCurrentTime HTTP/1.1\r\n
    User-Agent: PostmanRuntime/7.28.3\r\n
    Accept: */*\r\n
    Postman-Token: 2c8232b8-3984-424e-b77d-9470a290b16f\r\n
    Host: 192.168.0.25\r\n
    Accept-Encoding: gzip, deflate, br\r\n

 [truncated]Authorization: Digest username="admin", realm="Login to 487e5a44454e904373ec5eb024fa2c69", nonce="1482119029", uri="/cgi-bin/global.cgi?action=getCurrentTime", algorithm="MD5", qop=auth, nc=00000001, cnonce="YvLgEKOV", respons
     username="admin"
     realm="Login to 487e5a44454e904373ec5eb024fa2c69"
     nonce="1482119029"
     uri="/cgi-bin/global.cgi?action=getCurrentTime"
     algorithm="MD5"
     qop=auth
     nc=00000001
     cnonce="YvLgEKOV"
     response="0d4a5a73db732709c6a5bbe956f21f97"

Não estou sabendo a onde eu adiciono estas informações no componente para enviar, segue meu código:

   site:='http://'+inIP.Text+'/cgi-bin/global.cgi?action=getCurrentTime';


    IdHTTP1.Request.Clear;
    IdHTTP1.Request.BasicAuthentication:=False;
    IdHTTP1.Request.UserName := frmPrincipal.inUsuario.Text;
    IdHTTP1.Request.Password := frmPrincipal.inSenha.Text;
    IdHTTP1.Request.ContentType := 'application/json';
    IdHTTP1.Request.AcceptEncoding := 'gzip, deflate, br';
    IdHTTP1.HandleRedirects := True;
    IdHTTP1.AllowCookies := True;
    IdHTTP1.ReadTimeout:=3000;
    try // Primeira Tentativa
      lResponse:=frmPrincipal.IdHTTP1.Get(site);
    except
      begin
        case idHTTP1.ResponseCode of
          401 : begin
                  Memo1.Lines.Add('RawHeaders:');
                  Memo1.Lines.Add(idHTTP1.Response.RawHeaders.Text);
                  // Pegar Parâmetros da Resposta para nova Tentativa
                  vrealm:=TrataString('realm',idHTTP1.Response.RawHeaders.Text);
                  vqop:=TrataString('qop',idHTTP1.Response.RawHeaders.Text);
                  vnonce:=TrataString('nonce',idHTTP1.Response.RawHeaders.Text);
                  vopaque:=TrataString('opaque',idHTTP1.Response.RawHeaders.Text);
                  IdHTTP1.Request.CustomHeaders.Values['Authorization']:='Digest username="admin",'+
                                                                   ' realm="'+vrealm+'",'+
                                                                   ' nonce="'+vnonce+'",'+
                                                                   'uri="/cgi-bin/global.cgi?action=getCurrentTime", algorithm="MD5", qop=auth, nc=00000001,'+
                                                                   'cnonce="2pefWTXe",'+
                                                                   'response="409244ccc8ae9136798ddb0c661b6558",'+
                                                                   'opaque="'+vopaque+'"';
                  try // Segunda Tentativa
                    lResponse:=frmPrincipal.IdHTTP1.Get(site);
                  except
                  end;
                  Memo1.Lines.Add('Código da Resposta: '+IntToStr(frmPrincipal.idHTTP1.ResponseCode));
                end;
        end;
      end;
    end;
    result :=lResponse;

function TrataString(campo,linha:String):String;
var n,ref:Integer;
    valor:String;
begin
  ref:=pos(campo,linha);
  if ref<> 0 then
    begin
       ref:=ref+length(campo)+1;
       for n:=ref to length(linha) do
        begin
            if linha[n]<>',' then
              begin
                if linha[n]<>'"' then
                  valor:=valor+linha[n];
              end
            else
              break;
        end;
    end;
    Result:=valor
end;
 

  • 2 anos depois...
  • Consultores
Postado
3 horas atrás, rcbfreitas disse:

Conseguiu Resolver?

sua situação é a mesma API?

acho que é meio antigo o tópico, cria um para você e detalhando qual API está tentando acessar e mensagens

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 723 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...