Bonjour,
je suis entraind e faire une application mobile androis avec cordova, j'ai crée un api sous cakephp sur un serveur distant, quand j'envoie une requete post par ajax au serveur un message d'erreur dans le console, malgré mes recherches sur google je ne m'ensors pas.
l'erreur est la suivante: Blocage d’une requête multi-origines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://www.nomdedomaine.com/api/users/login. Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant.
voici mon code d'envoie

<script>
$(document).ready(function() {

     $("#login").click(function() {
        email = $("#UserUsername").val();
        pass = $("#UserPassword").val();
          if(email!='' || pass !=''){

           $.ajax({
                    url : 'http://www.nomdedomaine.com/api/users/login',
                    header: {'Access-Control-Allow-Origin': 'http://www.nomdedomaine.com/'},
                    crossDomain: true,
                    async : false,
                    data:$("#formlogin").serialize(),
                    dataType : 'json',
                    type : 'Post',
                    success : function(data) {
                        alert('loggin');
                             window.location.replace('besoin.html');
                            return;
                    },
                    error : function(xhr, status, err) {
                        //alert('no loggin');
                        alert(err);
                    }
            });
         }else{ window.location.replace('login.html');}
       });
                });

            </script>

Comment je peux résoudre ça?
merci

13 réponses


houceni
Réponse acceptée

Yo!

Il faut tout simplement rajouter un header.
Au niveau de ton AppController tu ajoutes ceci:

function beforeFilter(){
    header("Access-Control-Allow-Origin: *");
}

Bonsoir.
Le problème n'est pas lié à CakePHP directement, lorsque l'on essaie de faire une requête sur un serveur distant qui n'est pas situé dans le même domaine, il y a la protection par défault, donc si tu veux pouvoir faire des requêtes ajax dessus, il te faut l'autoriser sur ton application CakePHP, voir ici pour CakePHP : Les Objets Request & Response » Définir les En-têtes de Requête d’Origine Croisée (Cross Origin Request Headers = CORS).

wenz
Auteur

Bonsoir merci pour la réponse,
je viens de mettre le code pour l'activation de cros domain, mais j'ai toujours la meme erreur:
la manoère dont k'ai procéde
voici mon code:
public function login(){
$this->response->header('Location', 'http://wwww.jpbbeurpro.com/api/users/login');
$this->autoRender=false;
$this->response->type('json');
$this->response->body(json_encode(array('message'=>'Hello world!')));

}
J'ai bien procedé?
Merci

Tu es bien sur d'avoir regarder le chapitre consacré dont je t'ai donné le lien ?
Car dans le code que tu montres, tu n'utilises absolument pas ce qui est dans le chapitre.

wenz
Auteur

Bonjour,
le lien que tu m'avais donné est pour cakephp 3 si je ne me trompe pas, moi je suis sur cakephp 2.x

rien a voir avec cakephp. c'est au niveau de ton serveur web. apache ou nginx.

moi j'utilise nginx et j'ai rajouté ca dans mon vHost

location ~ \.php$ {
        if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                #
                # Om nom nom cookies
                #
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                #
                # Custom headers and headers various browsers *should* be OK with but aren't
                #
                #add_header 'Access-Control-Allow-Headers' 'Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,X-Authorization';
            add_header 'Access-Control-Allow-Headers' '*';
                #
                # Tell client that this pre-flight info is valid for 20 days
                #
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }
            if ($request_method = 'POST') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            #add_header 'Access-Control-Allow-Headers' '*';
                #add_header 'Access-Control-Allow-Headers' 'Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,X-Authorization';
        }
            if ($request_method = 'GET') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            #add_header 'Access-Control-Allow-Headers' 'Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,X-Authorization';
            #add_header 'Access-Control-Allow-Headers' '*';
            }

        fastcgi_pass   127.0.0.1:9000;
       [...]
      }

a toi de rajouter les $request_method qui vont bien (notamment pour le PUT, le DELETE etc...)

wenz
Auteur

keulu merci pour ta réponse, mais je suis un hébergement mutualisé one.com, je peux utiliser ta soluation?

wenz
Auteur

Advancid, je suis cakephp 2.x comment je peux gerer ça, apres mes recherches sur google avec ce code certaines personnes ont corrigé le problème

parent::beforeFilter();
        $this->response->header('Access-Control-Allow-Origin','*');
        $this->response->header('Access-Control-Allow-Headers','Content-Type, x-xsrf-token');
        $this->response->header('Access-Control-Allow-Methods','GET, PUT, POST, OPTIONS, DELETE');
        $this->Auth->allow();
        $this->Security->csrfCheck = false;
        $this->Security->unlockedActions = array('edit','delete','add','view');

        //Security method
        $this->Security->requirePut('edit');
        $this->Security->requireGet('view');
        $this->Security->requireGet('index');
        $this->Security->requirePost('add');
        $this->Security->requireDelete('delete');

mais chez moi ça ne marche toujours pas

Yo,
l'as tu préciser également côté Cordova (config.xml) ?

wenz
Auteur

non je n'ai pas précisé ça dans config.xml faut que je le fasse labas aussi?

je peux pas être catégorique car je suis débutant mais dans mon config.xml j'ai çà :
<access origin="*" />

wenz
Auteur

j'ai ça aussi

wenz
Auteur

Merci ça marche