[Cakephp 3] CSRF, ajax, ce genre de prise de tête ^^

61172
,

Bonjour bonsoir joyeux noel,

Voila je rencontre un GIGANTESQUE problème avec mon code.

Ce que je fais

J'ai le composant CSRF activé sur tout le site, et j'utilise xhr.setRequestHeader dans mes fonctions AJAX pour injecter le token dans le header, et ça fonctionne bien :

    $.ajax({
        url: '/comment/load',
        method: 'POST',
        data: {
            id: id,
        },
        beforeSend: function(xhr){
            xhr.setRequestHeader('X-CSRF-Token', $.cookie('csrfToken'));
        },          
        success: function(result){
            $('#comment').html(result);
        }
    });

Ce que j'obtiens

De manière totalement aléatoire, parfois j'obtiens une erreur 403, avec le message : 'missing csrf token', alors que le code ne change pas, tout est pareil, les en-tetes de requêtes et de réponses sont exactement les mêmes, mais bim... 403, et je peux rejouer la requête juste après, elle me renvoi une 200, parfait ça marche.... je m'arrache les cheveux !

5 Réponse

122333
,

Bonjour,
Je suis dans le même cas sauf que je n'ai que des erreurs 403!

Je suis en train de faire le tutoriel "Système de messagerie (2/3) : VueJS" en utilisant Cakephp3.
Mes actions du Controllers Conversations sont réservés aux utilisateurs en lignes, elles sont donc protégées par le Component Auth de Cakephp 3. Dès le debut de la partie de 2 du tutoriel "Système de messagerie (2/3) : VueJS", je cherche à atteindre l'action 'show' du controller Conversations par une requête Ajax et je tombe sur une erreur 403.

Je savais que le composant Auth de cakephp 3 se base sur la session pour authorisé ou non l'accès à une action. Ceci dit, même étant connecté la requête Ajax retourne une erreur 403. Ceci voulant dire, que lors d'une requête Ajax la sesssion n'est pas prise en compte si je puis dire...

Parcourant le forum et les forums et continuant à suivre le tutoriel je comprends le role du Csrf token. Je met donc le composant Csrf dans mon Controller Conversations et je m'aperçois que maintenant j'ai un Csrf token en cookies lorsque mon utilisateur est connecté en plus de sa présence en session. Je me dis alors qu'en plaçant ce Csrf token issue des cookies dans le headers de ma requête Ajax, Cakephp3 au-déla du composant Auth et de la session comprendra que mon utilisateur est connecté et authorisera l'action initialement protégée par le composant Auth! Et non! Je suis constament avec une erreur 403 sur mes requêtes Ajax.

Pour les utilisateurs de Cakephp3 qui auraient suivis le tutoriel "Système de messagerie (2/3) : VueJS" ou tout simplement pour ceux qui peuvent m'éclairer : Comment permettre a une requête Ajax de ne pas retourner une erreur 403 lorsque cette requête est faite pour une action protéger par le composant Auth de ckapephp3 ?

Je me suis efforcé d'être le plus clair possible, se topic me semble être le bon pour poser cette question sinon je peux en créer un pour converser sur ces 3 points qui sont la requête Ajax, le composant Auth, et le Csrf token.

Merci

Default
,

Bonjour,
Comme tu le dit en ajax les sesions ne fonctione pas, car tu est dans une API REST. Il faudrait que tu est une url :

/api/user

pour récupéré les informations d'un utilisateur qui est connecté avant de récupéré ses conversation. Je sais sur le framework Laravel il y a une url api/user de préconfiguré. Dans la configuration auth il utilise les tokens pour autoriser l'accès à ces information.

Avez-vous regardez dans la documentation officiel de CAKEPHP? J'ai peut-être trouvé peut-être une piste intéréssante sur la documentation officiel de CAKEPHP dans la section Auth par raport d'une API REST :

https://book.cakephp.org/3.0/fr/controllers/components/authentication.html#creer-des-cles-d-api-pour-une-authentification-basic

Bonne chance dans vos projet.

122333
,

Merci de votre reponse qui m'as permit de ranger encore mieux dans ma tête ce que l'on entend par API et API REST.
Pour résoudre mon problème j'ai fais comme dans le tutoriel mais avec cakephp,  je m'explique :

  • j'ai mis le composant csrf dans l'initialisation de mon controller
  • j'ai mis une balise méta avec le csrf
  • en besoin de requête ajax, jinforme dans le header de la requête ajax ce csrf.

Ainsi mes requête ajax ne retourne aucune erreur et un satut 200.

Jai regardé et je vais regarder de plus près le lien vers le doc que vous avec mis, ça me semble une autre solution sûrement plus propre.

Merci

Default
,

Ça me fait plaisir.. :)

61172
,

jeanvaljean pourrais-tu mettre des bouts de code de ce que tu fais ? j'aimerai voir le processus plus précisement merci :)