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 :

Webservices - connexions via certificats - SOAP - Delphi


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Webservices - connexions via certificats - SOAP - Delphi
    Bonjour à toutes et tous,
    Je recherche la meilleure méthode pour utiliser un Web Service.
    Je travaille sous delphi Rio 10.3 et j'utilise un Web Service qui ne m'appartient pas.
    Je dois réaliser une authentification Basic, j'ai une "action" et un "to" à fournir au wsdl.

    Pourriez-vous me dire s'il existe un composant natif utilisable directement ?
    Auriez-vous des exemples d'utilisation de Web Service sans connexion dans un premier temps ?

    J'ai déjà réalisé quelques tests avec Clever et ses composants et avec Indy (sans certificat).

    J'ai trouvé quelques posts sur le forum mais pas assez d'informations pour moi
    https://www.developpez.net/forums/d9...s-webservices/
    https://www.developpez.net/forums/d8...s-webservices/
    https://www.developpez.net/forums/d1...e-via-httprio/

    Merci beaucoup pour votre aide

  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
    Bonjour,

    je commencerais par Expert d'importation WSDL
    Là c'est une galère pour trouver les bonnes options pour avoir le mapping SOAP qui à la fois standard et tout le temps contourné

    Citation Envoyé par sigiaccio Voir le message
    Je travaille sous delphi Rio 10.3 et j'utilise un Web Service qui ne m'appartient pas.
    Un compte bac à sable serait à réclamer au prestataire

    Citation Envoyé par sigiaccio Voir le message
    Je dois réaliser une authentification Basic, j'ai une "action" et un "to" à fournir au wsdl.
    le WSDL est un descripteur de WS, il n'y a rien à lui fournir, et cela n'a aucun rapport avec authentification Basic qui n'est que le passage du Login+PW encodé en base64 comme entête HTTP
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si il c'est une "SOAPAction" qui à l'instar de l'authentification Basic est aussi un entête HTTP


    Citation Envoyé par sigiaccio Voir le message
    Pourriez-vous me dire s'il existe un composant natif utilisable directement ? .
    THTTPRIO et objet TRemotable et THTTPReqResp.ClientCertificate


    Citation Envoyé par sigiaccio Voir le message
    Auriez-vous des exemples d'utilisation de Web Service sans connexion dans un premier temps ?
    Un WebService étant sur un serveur, vous ne faîtes qu'invoquez le WS, donc un mode "sans connexion" ça n'existe pas en dehors de phase initiale de l'utilisation Expert d'importation WSDL et de l'intégration de ce Wrapper de WS dans votre projet
    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 averti

    Profil pro
    Inscrit en
    Février 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 17
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si
    Ca pourrait avoir du sens s'il s'agissait des balises de routage xml "ws-adressing" à rajouter dans l'entête.

    https://docs.intersystems.com/irisla...P_WSADDRESSING

    Ca doit être un effet de mode, elles sont de plus en plus demandées.
    Les balises en question

    To:destination address
    Action: SoapAction
    MessageID: unique uuid
    ReplyTo: anonymous

    sont soit prévues dans le wsdl, soit à implémenter soi même.

    En java cela se fait par un simple annotation, mais en Delphi rien n'existe, il faut les ajouter soi-même dans le header.

    hélas, les informations fournies avec la question sont trop vagues pour se faire une idée précise



    Pour constituer l'entête de sécurité rien n'existe par défaut non plus il faut googler sur WSSE.PAS qui est une unité créé par Bruneau babet d'embarcadero
    et mise à disposition sur les anciens forums il y a fort fort longtemps.

    mais on retrouve des copies un peu partout sur le net en cherchant WSSE.PAS

    https://adhainestech.ca/delphi-soap-and-wsse/
    https://github.com/ronaldhoek/SOAPStuff
    https://forum.delphi.cz/index.php/topic,15329.0.html

    par contre le ws-adressing n'existait pas à l'époque, ça ne fait que l'autentification (et par chance que la basique ^^)


    Sinon pour tout le reste il y a l'outil wsdlimp.exe et le composant standard Thttprio

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Merci
    Citation Envoyé par ShaiLeTroll Voir le message
    Bonjour,

    je commencerais par Expert d'importation WSDL
    Là c'est une galère pour trouver les bonnes options pour avoir le mapping SOAP qui à la fois standard et tout le temps contourné


    Un compte bac à sable serait à réclamer au prestataire


    le WSDL est un descripteur de WS, il n'y a rien à lui fournir, et cela n'a aucun rapport avec authentification Basic qui n'est que le passage du Login+PW encodé en base64 comme entête HTTP
    "action" \ "to" ... sans contexte, cela n'a pas de sens particulier sauf si il c'est une "SOAPAction" qui à l'instar de l'authentification Basic est aussi un entête HTTP



    THTTPRIO et objet TRemotable et THTTPReqResp.ClientCertificate



    Un WebService étant sur un serveur, vous ne faîtes qu'invoquez le WS, donc un mode "sans connexion" ça n'existe pas en dehors de phase initiale de l'utilisation Expert d'importation WSDL et de l'intégration de ce Wrapper de WS dans votre projet
    Merci, je vais regarder à cela et reviens vers vous rapidement avec des solutions ou questions ;-)

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Retour suite aux informations fournies
    Bonjour,

    Voici mes premiers tests sur SOAP ui que j'aimerais répercuter sur delphi RIO.

    • je possède un certificat .pfx avec un mot de passe que je place dans les "keystores".
    • au niveau des "outgoing WS-Security Configurations", je définis une signature avec le keystore (.pfx)

    Dans la signature, j'indique "Issuer Name and Serial Number"
    • l'authenfication est mise sur "Basic"
    • je dois définir des WS-A :
      - Enable WS-A addressing
      - Action : définir une url fournie
      - To : je donne l'url fournie
      - MessageId : génération automatique


    En delphi, j'ai réussi à utiliser le webservice de cadmap avec la fonction getListeCommunes.
    J'arrive à récupérer le nom de la première commune.
    J'utilise le composant TclHttp et TclSoapMessage de Clever.

    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
       request :=
          '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.ws.cadmap.nsi.be/">'+
          '<soapenv:Header/>'+
          '<soapenv:Body>'+
          '<soap:getListeCommunes/>'+
          '</soapenv:Body>'+
          '</soapenv:Envelope>';
     
        clSoapMessage1.BuildSoapMessage(request);
     
      response := clHttp1.Post('http://geoservices.wallonie.be/cadmap/soap/', clSoapMessage1);
     
      dom := CoDOMDocument.Create();
      dom.loadXML(WideString(response));
     
      node := dom.selectSingleNode('//nom');
      if (node <> nil) then
      begin
        edt.Text := string(node.text);
      end;

    Je reviens vers vous dès que j'ai plus de détails.
    Je fournirai le code dès que j'ai trouvé ;-)
    N'hésites pas à me poser des questions.

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    alors sous Delphi en standard tu as WDSLImp, qui est disponible aussi dans l'IDE par Composant/Importer WSDL et qui permet de produire une unité Delphi pour invoquer un WebService SOAP d'après son descriptif (WSDL).

    par contre, il faut bien voir que SOAP c'est un langage de description qui existe en plusieurs versions et qui permet un tas de choses assez complexes qu'il est difficile de traduire en langage de programmation...donc tu peux toujours tomber sur un fichier valide du point de vue de SOAP mais qui merde sous Delphi, mais également sous d'autres langages...tout ce qui est utilisé classiquement ça fonctionne, mais sur certain cas tordus ou simplement peu communs, ça coince.

    je pense que tu parles de WSAddressing en effet, ça au départ c'est pas bien compliqué, c'est juste un entête qu'il faut ajouter dans une syntaxe pas très intuitive dont tu peux trouver des exemples ici.

    si ton certificat et utilisé pour la négociation TLS ça va, mais s'il doit en plus signer la requête, la ça devient compliqué, et ce n'est pas supporté à ce jour par Delphi en standard. Il faut dire que la signature d'une requête SOAP c'est un peu galère, et l'architecture utilisée par Delphi n'est pas assez souple pour permettre de le faire à la volée...à la rigueur il faut le faire dans un second temps juste avant d'envoyer la requête.

    NB: dans les derniers patch 10.4 il y a eu des correctifs sur SOAP, essentiellement des WSDL qui plantaient WSDLImp ou qui donnait des unités qui ne compilaient pas (identifiant non défini...), cela montre que Embarcadero n'a pas laissé tomber SOAP qui est pourtant une vieille techno, surtout utilisée par des administrations qui n'ont pas investi dans de nouvelles technos (REST par exemple).

    Note que j'ai personnellement travaillé sur des WebServices SOAP assez casse pied avec signature avec des certificats self-signed, tout pour plaire, et j'ai préféré coder moi même les fonctions SOAP basées sur de la concaténation.

    au final j'ai par exemple la function soap()
    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
     
    function xmlTag(const Name, Params, Value: UTF8String): UTF8String;
    begin
      Result := '<' + Name;
      if Params <> '' then
        Result := Result + ' ' + Params;
      if Value <> '' then
        Result := Result + '>' + Value + '</' + Name + '>'
      else
        Result := Result + '/>';
    end;
     
    function soap(const Header, Body: UTF8String): UTF8String;
    begin
      // SOAP 1.2
      Result := '<?xml version="1.0" encoding="utf-8"?>'
              + xmlTag('soap:Envelope', 'xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"',
                  xmlTag('soap:Header', '', Header)
                + xmlTag('soap:Body', '', Body)
              );
    end;
    par contre je me paluche la WSDL à la main pour produire le code XML qui va bien, mais du coup je peux produire une portion du XML, en calculer un Hash, le signer, remettre tout cela dans l'entête etc...toujours par de simples concaténations de chaînes.

    idéalement il faudrait pouvoir produire ces fonctions automatiquement d'après le WSDL mais ça j'ai pas.

    mais au final SOAP c'est juste ça, je transforme l'appel d'une méthode d'objet en un code XML qui est plus ou moins complexe, voir encapsulé dans une enveloppe MIME (MTOM) et envoyé en HTTP(s) vers un serveur web qui répond du XML qui contient la réponse codée aussi de façon plus ou moins complexe.

    pour le décodage j'ai créé Execute .XML.Tree qui permet de parser un XML en mémoire, et je vais y piocher les informations qui m'intéresse.

    par exemple, voici le code de détection d'une erreur
    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
     
    function TResponse.SOAPError(xml: PAnsiChar; Len: Integer; var Tree: TXMLTree): Boolean;
    var
      Node: PXMLNode;
    begin
      FError := '';
      try
        Tree.BuildFrom(xml, Len);
      except
        on e: Exception do
        begin
          FError := e.Message;
          Exit(True);
        end;
      end;
      Node := Tree.XPathNode('Envelope/Body/Fault');
      if Node = nil then
        Result := False
      else begin
        FError := string(xmlDecode(Node^['Reason']^['Text'].Value));
        ReportError(Tree.Source);
        Result := True;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2020
    Messages : 25
    Par défaut Suite
    Bonjour,
    Merci beaucoup pour votre réponse.

    Merci pour le WS adressing, je vais tester.

    Mon certificat doit signer la requête - je continue mes tests...

    Je reviens vers vous dès que j'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [X3-V11] WebService Connexion SOAP
    Par fred.pan dans le forum SAGE
    Réponses: 3
    Dernier message: 23/09/2019, 09h48
  2. Accès WebService via certificat SSL P12
    Par Tequilapaf dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 03/06/2015, 18h07
  3. Apache HTTPClient : Connexion SSL via certificat PKI
    Par mathias.deshayes dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 08/06/2011, 11h42
  4. connexion via asp ou php ?
    Par cege dans le forum 4D
    Réponses: 5
    Dernier message: 25/01/2006, 08h43
  5. [CR 9] [ASPX][C#]connexion via code
    Par nannous dans le forum Connectivité
    Réponses: 3
    Dernier message: 20/08/2003, 15h12

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