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

AJAX Discussion :

Ajax inter domaine


Sujet :

AJAX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 48
    Points
    48
    Par défaut Ajax inter domaine
    Bonjour,

    Je veux utiliser Ajax pour charger des données issu d'un premier serveur "www.sitePourLogin.fr" depuis un second serveur "www.mySite.fr"

    Si j'utilise Ajax simplement sur le server www.mySite.fr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        $.ajax({type: 'POST', url : 'www.sitePourLogin.fr/formlogin',cache: false, 
        success: function(data){ 
        console.log(data);
            if (data=='KO') { 
                alert('Pas de login');
            } else {
                $('#login').html(data);
            }
        }
    });
    J'ai l'erreur suivante :
    XMLHttpRequest cannot load http://www.sitePourLogin.fr/formlogin. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mySite.fr' is therefore not allowed access.
    Après recherche, il semble XMLHttpRequest utilisé entre différents domaines est interdit pour des raisons de sécurités. J'ai lu qu'il faut passer par du jsonp
    J'ai donc codé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        $.ajax({type: 'POST', url : 'www.sitePourLogin.fr/formlogin',cache: false, 
            dataType:'JSONP' ,
            contentType:"application/json; charset=utf-8",
        success: function(data){ 
        console.log(data);
            if (data=='KO') { 
                alert('Pas de login');
            } else {
                $('#login').html(data);
            }
        }
    });
    Mais ici j'ai l'erreur
    Uncaught SyntaxError: Unexpected token :
    Sur mon data très simple de retour {"login_form":"toto"}

    A noter que dataType:'JSON' reviens à la première erreur.

    Je suis bloqué.
    Aurriez-vous des pistes de résolution ?

    Merci beaucoup pour vos suggestions

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    Citation Envoyé par ouioui2000 Voir le message
    J'ai l'erreur suivante :
    XMLHttpRequest cannot load http://www.sitePourLogin.fr/formlogin. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mySite.fr' is therefore not allowed access.
    configure l'entête HTTP Access-Control-Allow-Origin de la page, c'est peut être suffisant pour autoriser l'accès

    si par exemple c'est du PHP, ajoute ce code :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Access-Control-Allow-Origin: http://www.mySite.fr");

  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Je crois que cela ne suffira pas, personnellement je ne connais pas de méthode permettant d'outrepasser l'interdiction d cross-domain en ajax.

    La bonne manière de procéder dans ces cas là, c'est de passer par un script interne qui lui appellera la page voulue (avec curl par exemple) et renverra le résultat à la page.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    Merci, une sacré épine du pied enlevé :-)
    J'utilise Symfony2, une réponse avec 'Access-Control-Allow-Origin' = '*' a résout mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $response = new Response($this->renderFormLogin());
    $response->headers->set('Access-Control-Allow-Origin', '*');
    return $response;
    Par contre, Je suis maintenant confronté à un problème de "Invalid CSRF token" avec symfony2.
    Le formulaire de login content bien un CSRF token généré par le serveur. Le formulaire marche bien sur le même domaine mais si je change de domaine, j'ai cette erreur "Invalid CSRF token".

  5. #5
    Invité
    Invité(e)
    Par défaut
    En modifiant les entêtes de la requête, vous n'avez fait que déplacer le problème et peut être créer d'autre problèmes de sécurité.
    La solution est celle proposée par Spartacusply. Faire un script proxy qui fera la requête au serveur tiers.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    Je comprend.
    L'utilisation de curl pour générer le html du formulaire de login me semble une bonne idée. ce site le décrit bien.
    Mais je ne vois pas pourquoi le jeton CSRF serait plus valide avec un accès Curl plutôt que par requête xmlhttprequest. Je vais plutôt chercher du coté symfony2 le fonctionnment de validation de ce jeton CSRF et tenter le contourner.

    Merci d'avoir pris le temps de répondre, cela m'a fait avancer.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    J'ai codé un acces via curl car cela semble effectivement plus propre.
    A toutes fins utiles, voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $cred_data = array();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://www.monSite.net/tilogin');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($cred_data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIESESSION, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    $result = curl_exec($ch);
     
    echo $result;
    https://www.monSite.net/tilogin revoie le html du formulaire de login.

Discussions similaires

  1. Réponses: 19
    Dernier message: 20/03/2010, 14h27
  2. Stratégie inter-domaines introuvable
    Par Pyroa dans le forum Silverlight
    Réponses: 3
    Dernier message: 12/03/2010, 09h13
  3. Réponses: 0
    Dernier message: 07/07/2009, 13h16
  4. [Ajax] Cross domain et access denied
    Par Dinaïz dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 22/03/2006, 22h29

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