IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

TIdhttp (HTTP/1.1 403 Forbidden)


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Par défaut TIdhttp (HTTP/1.1 403 Forbidden)
    Bonjour,

    Je viens solliciter votre aide pour comprendre un phénomène que je rencontre.

    On utilise les composants Indy notamment pour récupérer des images depuis un serveur distant. Et ça fonctionne bien jusque là sauf pour un url donné (en Https).

    A la suite d'un test rapide sur un navigateur, l'url fonctionne correctement.

    Par contre, avec Postman, quand j’exécute plusieurs fois la même requête (GET method), le retour provient soit du serveur AkamaiGHost avec un message d'erreur 'HTTP/1.1 403 Forbidden. Access denied. You don't have permission on this server' soit du serveur AmazonS3 avec un statuscode 200 et l'image attendue.

    A noter que depuis l'application, le retour provient systématiquement du serveur AkamaiGHost et donc avec le message d'erreur cité ci-dessus (avec les composants Indy).

    J'ai donc voulu tester l'url avec les composants Rest Client et là c'est le serveur AmazonS3 qui répond avec un statuscode 200 et l'image souhaitée.

    Est-ce que quelqu'un a déjà rencontré ce problème ou peut m'aider à comprendre ce qui se passe ?
    Je vous remercie d'avance.
    Passion_Delphi

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Tu as un bien un IOHandler SSL pour gérer le HTTPS et non du HTTP simple ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu as un bien un IOHandler SSL pour gérer le HTTPS et non du HTTP simple ?
    Oui, on utilise TIdSSLIOHandlerSocketOpenSSL.

    Ci dessous le code de mes tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    var
      lStream: TMemoryStream;
    begin
      IdHttp1 := TIdHTTP.Create(nil);
      try
        IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create(IdHttp1);
        try
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method      := sslvTLSv1_2;
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode        := sslmClient;
          // IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode  := [sslvrfClientOnce, sslvrfPeer];
          IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;
          // IdSSLIOHandlerSocketOpenSSL1.OnVerifyPeer           := OnVerifyPeer;
          IdLogEvent1                                         := TIdLogEvent.Create(Self);
          try
            IdLogEvent1.ReplaceCRLF   := False;
            IdLogEvent1.LogTime       := False;
     
            IdLogEvent1.OnReceived    := OnReceivedData;
            IdLogEvent1.OnSent        := OnSentData;
            IdLogEvent1.OnStatus      := OnStatusEvent;
     
            IdHTTP1.Request.BasicAuthentication := False;
            IdHTTP1.Request.Accept    :='*/*';
            IdHTTP1.Request.AcceptEncoding:='gzip, deflate';
            IdHTTP1.Request.Connection:='Close';
            IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0';
            IdHTTP1.Request.CharSet   := 'utf-8, *;q=0.8r';
            IdHTTP1.Request.AcceptLanguage := 'en-us,en;q=0.5';
            IdHTTP1.Request.CustomHeaders.AddValue('Clear-Site-Data','*');
     
            IdHttp1.AllowCookies      := True;
            IdHTTP1.HandleRedirects   := True;
            IdHTTP1.RedirectMaximum   := 35;
            IdHTTP1.ConnectTimeout    := 12000;
            IdHTTP1.ReadTimeout       := 12000;
            IdHTTP1.MaxAuthRetries    := 10;
            IdHTTP1.HTTPOptions       := [hoForceEncodeParams];
     
            IdHTTP1.IOHandler         := IdSSLIOHandlerSocketOpenSSL1;
            IdHTTP1.IOHandler.Intercept := IdLogEvent1;
     
            IdHTTP1.OnRedirect        := OnRedirect;
            IdHTTP1.OnProxyAuthorization:= OnProxyAuthorization;
            IdHTTP1.OnChunkReceived   := OnChunkReceived;
            IdHTTP1.OnConnected       := OnConnected;
            lStream                   := TMemoryStream.Create;
            try
              try
                IdLogEvent1.Active    := True;
                IdHTTP1.Get(URL, lStream);
                if IdHTTP1.ResponseCode in [200, 201] then
                begin
                  lStream.Position := 0;
                  Image1.Picture.LoadFromStream(lStream);
                  Image1.Stretch := True;
                  Image1.Repaint;
                end
                else
                begin
                  Memo1.Lines.Add('Echec :  '+ IdHttp1.ResponseText);
                end;
              except
                on e:exception do
                begin
                  Memo1.Lines.Add('Exception : '+ e.Message);
                end;
              end;
            finally
              FreeAndNil(lStream);
            end;
          finally
            IdLogEvent1.Active := False;
            FreeAndNil(IdLogEvent1);
          end;
        finally
          FreeAndNil(IdSSLIOHandlerSocketOpenSSL1);
        end;
      finally
        FreeAndNil(IdHTTP1);
      end;

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut



    Avec le TRestClient, la gestion du SSL est implicite (dans IPPeerCommon et IPPeerClient), cela se débrouille tout seul avec les certificats Windows, j'ai d'ailleurs du remplacer le TRestClient qui dépend du THTTPClient et dans D10, cela ne remonte pas toutes les possibilité de gestion de certificat comme l'erreur ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED retourné par les API Windows WinHTTP 5.0, la gestion du HTTPS est implicite (l'URL fourni l'indication de protocol)

    J'ai du remplacé TRESTClient\TRESTRequest par TIdHTTP\TIdHTTPRequest avec une gestion explicite HTTPS via OpenSSL ( libeay32.dll \ ssleay32.dll + TIdSSLIOHandlerSocketOpenSSL).
    Donc un code similaire au tient mais je suis loin de changer les options

    je me limite à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //------------------------------------------------------------------------------
    class procedure TRESTClientByIndy.ToggleHTTPS(ARequest: TIdHTTP; const AURL: string);
    begin
      ARequest.HandleRedirects := True;
     
      if StartsText('https://', AURL) then
      begin
        ARequest.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Nil);
        TIdSSLIOHandlerSocketOpenSSL(ARequest.IOHandler).SSLOptions.Method := sslvSSLv23; // la valeur sslvSSLv23 laisse au server le choix du protocole, on ne s'en occupe pas
      end;
    end;
    utilisé dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //------------------------------------------------------------------------------
    class function TRESTClientByIndy.Get(const AURL, AResource: string; AParams: TClientMicroService.TRequester.TRequestParams; const AToken: string = ''; ATimeOut: Integer = -1): TJSONObject;
    var
      VIdHTTP: TIdHTTP;
      VResponse: string;
    begin
      VIdHTTP := TIdHTTP.Create(nil);
      try
        ToggleHTTPS(VIdHTTP, AURL);
     
        if AToken <> '' then
          VIdHTTP.Request.Authentication := THTTPBearerAuthentication.Create(AToken); // TIdHTTPRequest owns Authentication
     
        VResponse := ExecuteGet(VIdHTTP, AURL, AResource, AParams, [200]);
     
        Result := TJSONObject.ParseJSONValue(VResponse) as TJSONObject;
      finally
        VIdHTTP.IOHandler.Free();
        VIdHTTP.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Et la même chose à base TRESTClient, je me suis fait une couche d'abstraction pour passer de l'un à l'autre suite au problème de HTTPS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    //------------------------------------------------------------------------------
    class function TRESTClientByIPPeer.Get(const AURL, AResource: string; AParams: TClientMicroService.TRequester.TRequestParams = nil; const AToken: string = ''; ATimeOut: Integer = -1): TJSONObject;
     
      function AuthenticatorFactory(): TCustomAuthenticator;
      begin
        if AToken <> '' then
        begin
          Result := TOAuth2Authenticator.Create(nil);
          try
            TOAuth2Authenticator(Result).AccessToken := AToken;
            TOAuth2Authenticator(Result).TokenType := TOAuth2TokenType.ttBEARER;
          except
            FreeAndNil(Result);
            raise;
          end;
        end
        else
          Result := nil;
      end;
     
    var
      VClient: TRESTClient;
      VRequest: TRESTRequest;
      Param: TRequestParam;
    begin
      VClient := TRESTClient.Create(AURL);
      try
        VRequest := TRESTRequest.Create(VClient); // The Client owns the Request (will free it) and it will assign as Client property
        VRequest.Resource := AResource;
        VRequest.Method := TRESTRequestMethod.rmGET;
     
        if Assigned(AParams) then
          for Param in AParams do
            VRequest.AddParameter(Param.Name, Param.Value, TRESTRequestParameterKind.pkGETorPOST);
     
        VClient.Authenticator := AuthenticatorFactory();
        try
          Execute(VRequest, ATimeOut, [200]);
        finally
          VClient.Authenticator.Free();
          VClient.Authenticator := nil;
        end;
     
        Result := VRequest.Response.JSONValue.Clone() as TJSONObject;
      finally
        VClient.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Par défaut
    Oui, le code réel a moins d'options que ça mais j'en ai rajouté pour essayer de voir si ça allait changé quelque chose et je dois dire que non.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Par défaut
    Avec le TRestClient, la gestion du SSL est implicite (dans IPPeerCommon et IPPeerClient), cela se débrouille tout seul avec les certificats Windows, j'ai d'ailleurs du remplacer le TRestClient qui dépend du THTTPClient et dans D10, cela ne remonte pas toutes les possibilité de gestion de certificat comme l'erreur ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED retourné par les API Windows WinHTTP 5.0, la gestion du HTTPS est implicite (l'URL fourni l'indication de protocol)

    J'ai du remplacé TRESTClient\TRESTRequest par TIdHTTP\TIdHTTPRequest avec une gestion explicite HTTPS via OpenSSL ( libeay32.dll \ ssleay32.dll + TIdSSLIOHandlerSocketOpenSSL).
    Donc un code similaire au tient mais je suis loin de changer les options
    Donc si j'ai bien compris ce que tu dis, ce n'est pas forcément une bonne idée d'aller remplacer IdHTTP par du RestClient ?

Discussions similaires

  1. WMS geoportail: Impossible d'accéder aux données (HTTP 403 Forbidden)
    Par agodfrin dans le forum IGN API Géoportail
    Réponses: 7
    Dernier message: 06/08/2014, 12h07
  2. [Sharepoint 2010]HTTP 403 : Forbidden.
    Par Avallack dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 21/01/2014, 11h32
  3. http://api.ign.fr/geoportail/ 403 Forbidden
    Par hm7845 dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 10/12/2013, 15h44
  4. Erreur HTTP 403 Forbidden (Interdit)
    Par Etienne maheu dans le forum Weblogic
    Réponses: 3
    Dernier message: 28/02/2013, 08h09
  5. HTTP/1.1 403 access forbidden
    Par Hepil dans le forum IIS
    Réponses: 4
    Dernier message: 04/05/2007, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo