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

IGN API Géoportail Discussion :

Erreur 403 en accès localhost avec application Flex


Sujet :

IGN API Géoportail

  1. #1
    Invité
    Invité(e)
    Par défaut Erreur 403 en accès localhost avec application Flex
    Bonjour,
    Je viens de créer un contrat pour pouvoir utiliser l'API IGN. Pour être sur, j'ai même mis comme URL d'accès http://localhost/ et j'ai obtenu la clé:
    5551222677765225227
    Mais à la récupération du jeton, j'obtiens une erreur 403. Selon la FAQ, cela peut venir de plusieurs raisons:
    * clé ou jeton invalide
    * nombre de session maximales du contrat atteint
    * IP ou REFERER invalide (en fonction du contrat)
    * surcharge globale du service
    Mon application est bien lancée depuis localhost (http://localhost/ws/TEST/bin-debug/TEST.html) et pourtant, impossible de récupérer un token.
    Je n'utilise pas l'API JavaScript car je viens d'une application Flex (j'ai pris un bout de code sur celui d'OpenScales).
    Voici mon projet de test:
    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
    <?xml version="1.0"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="onAppComplete()">
      <mx:Script>
        <![CDATA[
          import mx.controls.Alert;
          private var _loader:URLLoader = new URLLoader;
          
          private function onAppComplete():void {
            _loader.addEventListener(IOErrorEvent.IO_ERROR, onFault);
            _loader.addEventListener(Event.COMPLETE, onComplete);
            var req:URLRequest = new URLRequest("http://jeton-api.ign.fr/getToken");
            var dataV:URLVariables = new URLVariables;
            dataV.key = "5551222677765225227";
            dataV.output = "xml";
            req.data = dataV;
            try {
              _loader.load(req);
            } catch (e:Error) {
              Alert.show("Error");
              
            }
          }
          
          private function onComplete(event:Event):void {
            Alert.show("complete");
          }
          
          private function onFault(event:IOErrorEvent):void {
            Alert.show("fault");
          }
        ]]>
      </mx:Script>
    </mx:Application>
    Le code est très simple, il crée juste une requête (GET) vers le serveur de jetons en lui passant ma clé.
    Je tombe à chaque fois dans le onFault et Firebug m'indique que le code retourné est bien un 403.
    J'ai essayé avec l'exemple JS disponible lors de la création d'un contrat IGN, tout fonctionne correctement.

    Avez-vous une idée? Y a-t-il une manipulation spéciale à effectuer lorsque l'on utilise du Flash / Flex?

    Merci pour votre réponse
    Fabien

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par fnicollet Voir le message
    Avez-vous une idée? Y a-t-il une manipulation spéciale à effectuer lorsque l'on utilise du Flash / Flex?
    Requête cross-site, même problème qu'avec Javascript.

    Il faudrait charger les fichiers crossdomain.xml suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Security.loadPolicyFile("http://jeton-api.ign.fr/crossdomain.xml");
    Security.loadPolicyFile("http://wxs.ign.fr/crossdomain.xml");
    Puis, de passer par un proxy local à ton application pour récupérer le jeton.

    D'un autre côté, Openscales a mis en place tout cela pour le Géoportail ...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci pour votre réponse. Cependant, les instructions "Security.loadPolicyFile" en AS3 ne sont utiles que lorsque les fichiers crossdomain.xml ne sont pas situés à la racine du serveur web ou qu'il s'appelle autrement ou qu'il écoute sur un port différent. Par défaut, flash player va aller voir à l'adresse http://serveur/crossdomain.xml (j'ai vérifié dans les sources, OpenScales ne fait jamais de loadPolicyFile).

    J'ai essayé quand même dans mon application mais le résultat est le même.

    A mon avis, le script qui fait la détection de token (http://jeton-api.ign.fr/getToken) n'arrive pas à récupérer les bons headers (au niveau de l'URL appelante) lorsqu'elle vient directement de Flash Player. Comme il ne récupère pas l'URL, il n'arrive pas à matcher avec la clé et renvoie un 403.
    Openscales fonctionne car pour la requete de récupération de jeton et pour la récupération des tuiles, tout passe par un proxy PHP et les scripts de ign.fr doivent arriver à récupérer correctement les headers depuis le PHP.

    Voilà mon diagnostic à vue de nez, je peux très bien me tromper.

    Il ne me reste plus qu'à coder un proxy (si quelqu'un a un script Perl pour cela, je suis preneur !)

    Merci pour la réponse,
    Fabien

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par fnicollet Voir le message
    Bonjour,
    Merci pour votre réponse. Cependant, les instructions "Security.loadPolicyFile" en AS3 ne sont utiles que lorsque les fichiers crossdomain.xml ne sont pas situés à la racine du serveur web ou qu'il s'appelle autrement ou qu'il écoute sur un port différent. Par défaut, flash player va aller voir à l'adresse http://serveur/crossdomain.xml (j'ai vérifié dans les sources, OpenScales ne fait jamais de loadPolicyFile).

    J'ai essayé quand même dans mon application mais le résultat est le même.

    A mon avis, le script qui fait la détection de token (http://jeton-api.ign.fr/getToken) n'arrive pas à récupérer les bons headers (au niveau de l'URL appelante) lorsqu'elle vient directement de Flash Player. Comme il ne récupère pas l'URL, il n'arrive pas à matcher avec la clé et renvoie un 403.
    Openscales fonctionne car pour la requete de récupération de jeton et pour la récupération des tuiles, tout passe par un proxy PHP et les scripts de ign.fr doivent arriver à récupérer correctement les headers depuis le PHP.

    Voilà mon diagnostic à vue de nez, je peux très bien me tromper.
    Je pense pas

    Citation Envoyé par fnicollet Voir le message
    Il ne me reste plus qu'à coder un proxy (si quelqu'un a un script Perl pour cela, je suis preneur !)
    En voici un :

    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
    <?php
        // Get the REST call path from the AJAX application
        // Is it a POST or a GET?
        $url = ($_POST['url']) ? $_POST['url'] : $_GET['url'];
        $mimeType =($_GET['FORMAT']) ? $_GET['FORMAT'] : 'text/xml';
    
    
        // Open the Curl session
        $session = curl_init($url);
    
        // If it's a POST, put the POST data in the body
        if ($_POST['url']) {
            $postvars = '';
            while ($element = current($_POST)) {
                $postvars .= key($_POST).'='.$element.'&';
                next($_POST);
            }
            curl_setopt ($session, CURLOPT_POST, true);
            curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
        }
    
        // Don't return HTTP headers. Do return the contents of the call
        curl_setopt($session, CURLOPT_HEADER, false);
        curl_setopt($session, CURLOPT_REFERER, 'http://TON_REFERRER/');
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
    
        // Make the call
        $response = curl_exec($session);
    
        // The web service returns XML. Set the Content-Type appropriately
        header('Content-Type: '.$mimetype);
    
       if (curl_errno($session)) {
        echo curl_error($session);
       } else {
            echo $response;
        curl_close($session);
       }
    
    ?>
    il te reste à mettre ton TON_REFERRER ...

    Autre chtite question: tu utilises quel butineur ?)

  5. #5
    Invité
    Invité(e)
    Par défaut
    merci pour le script, mais sur la plupart de nos serveurs ont déjà Perl d'installé et pas PHP mais je vais trouver, merci.

    Sinon, bonne piste avec le navigateur !
    J'utilise Firefox et je me prend bien un 403
    Sauf qu'avec IE et Chrome, je passe bien dans le "complete"

    Etrange, une piste sur ce comportement?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Apparement il y a un problème récurrent avec le plugin Flash pour FF:
    http://www.tannerwilliamson.com/2010...ttp-referrers/
    Le referrer ne serait pas envoyé dans le header ...

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par fnicollet Voir le message
    Apparement il y a un problème récurrent avec le plugin Flash pour FF:
    http://www.tannerwilliamson.com/2010...ttp-referrers/
    Le referrer ne serait pas envoyé dans le header ...

    Et oui ! Cf. ... (bug répertorié dans openscales depuis le développement du module sécurité pour l'IGN)
    De manière étonnante, en passant les requêtes en POST cela fonctionne ... mais, j'ai pas voulu modifier les services du Géoportail pour ce bug

    Le proxy php résoud ce problème en mettant systématiquement le REFERRER, même quand il y est déjà (ce qui n'est pas bien)

    Pour le portage en Perl, c'est immédiat ou presque

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ok, merci beaucoup pour l'aide.
    C'est parti pour le proxy Perl, les tokens et les requêtes en GET (et le concours IGN ^^).

    Merci,
    Fabien

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je vais poster le proxy Perl que j'ai bricolé (il marche mais le Perl est loin d'être ma spécialité, c'est juste pour info):
    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
    #!"c:\perl\bin\perl.exe"
    use strict;
    use CGI;
    use LWP;
    
    my $browser = new LWP::UserAgent;
    my $cgi = new CGI; 
    print $cgi->header(-type => 'text/xml');
    my $URL = $cgi->param("url");
    my $header = new HTTP::Headers;
    $header->header('Referer', 'localhost');
    my $request = HTTP::Request->new(GET => $URL, $header, "");
    my $response = $browser->request($request);
    
    if ($response->is_success) {
    	my $headers = $response->headers();
    	print $headers->header("Content-Encoding");     
    	print $response->content."\n";
    } else {
    	print "Erreur:".$response->status_line."\n";  
    }
    et dans le code ActionScript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var req:URLRequest = new URLRequest("http://localhost/cgi-bin/urlproxy.pl");
    var dataV:URLVariables = new URLVariables;
    var apiKey:String = "5551222677765225227"; 
    var url:String = "http://jeton-api.ign.fr/getToken?key=" + apiKey + "&output=xml"; 
    dataV.url = url
    req.data = dataV;
    try {
    	_loader.load(req);
    } catch (e:Error) {
    	Alert.show("Error");
    }
    A noter qu'avec la technique du proxy localhost, on récupère dans n'importe quel cas un token, mieux vaut quand même utiliser sa clé API liée à son nom de domaine, c'est plus propre

    Fabien

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par fnicollet Voir le message
    Je vais poster le proxy Perl que j'ai bricolé (il marche mais le Perl est loin d'être ma spécialité, c'est juste pour info):
    La trame d'un proxy Perl est et téléchargeable (y en a même un en asp )

    Citation Envoyé par fnicollet Voir le message
    A noter qu'avec la technique du proxy localhost, on récupère dans n'importe quel cas un token, mieux vaut quand même utiliser sa clé API liée à son nom de domaine, c'est plus propre
    Et je te le conseille, sinon tes statistiques vont vite grimper si quelqu'un chope ta clef

  11. #11
    Invité
    Invité(e)
    Par défaut
    Parfait!

    Merci
    Fabien

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par fnicollet Voir le message
    Parfait!
    Est-ce [résolu]

  13. #13
    Invité
    Invité(e)
    Par défaut
    Désolé, je n'y pensé plus, c'est bel et bien résolu, j'arrive à accéder à mes tuiles. Elles apparaissent maintenant dans mon application "dans le désordre" mais c'est un problème du côté de mon application

    Merci pour l'aide,
    Fabien

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci pour l'analyse et l'astuce qui permet d'éviter la lourdeur d'un proxy

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2008, 17h26
  2. Accès interdit : Erreur 403
    Par Gaara-Manga dans le forum Apache
    Réponses: 6
    Dernier message: 12/05/2007, 11h25
  3. [EasyPHP] erreur 403 - accès administration
    Par caossak dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 05/05/2007, 00h09
  4. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50

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