2015-04-10 1 views
1

Mon application a bien fonctionné jusqu'à présent, lorsque tout a été fait en accédant à son adresse IP publique.Le cookie Django csrf n'est pas défini pour le sous-domaine lorsqu'il est accédé en iframe sur un site tiers

Maintenant, il est ajouté au site principal, en tant que app.mainsite.com. C'est accessible comme ça. Je peux me connecter, etc, tout.

Mais mon application est un peu spéciale en cela, une certaine fonctionnalité permet à ses utilisateurs d'ouvrir l'une de ses URL dans un iframe sur un site tiers où les scripts de l'application sont intégrés dans html, pour faire une application spécifique activité sur ces sites tiers. Maintenant, tout le monde pouvait voir les nouveautés apportées par l'application à ces sites tiers, mais pour modifier certains paramètres, il fallait être connecté à mon application. Si ce n'est pas le cas, on serait redirigé à l'intérieur du modal lui-même, et si la connexion était réussie, ils seraient redirigés vers la page d'édition des paramètres. Fondamentalement, toutes les demandes d'écriture à partir des sites tiers, a demandé au propriétaire du site d'être connecté à notre application. Soit ils peuvent se connecter à l'intérieur du modal, soit se connecter à partir d'un autre onglet, puis actualiser leur site pour pouvoir accéder à la vue d'édition.

Le problème est, tout à l'heure, tout a parfaitement fonctionné. Maintenant, je peux faire un post de formulaire avec des jetons csrf de app.mainsite.com, mais quand il est ouvert dans l'iframe, il lance CSRF cookie not set. J'ai vérifié l'onglet Ressources, et en dessous, le csrftoken dans app.mainsite.com ne correspond pas au csrfmiddlewaretoken dans le formulaire. Évidemment, ainsi, CSRF échoue.

Comment puis-je surmonter cela?

J'ai essayé de régler CSRF_COOKIE_DOMAIN='.mainsite.com' mais cela n'a pas fonctionné.

Que puis-je faire?

+0

Je comprends votre problème, mais je ne suis pas sûr de pouvoir vous aider sans examiner comment votre application fonctionne exactement. Je n'ai pas eu à faire face à des requêtes POST provenant d'un iframe intégré dans un site tiers, mais il semble que cela devrait fonctionner correctement. Je voudrais commencer par passer par 'CsrfViewMiddleware' et d'enquêter là où il échoue exactement: https://github.com/django/django/blob/master/django/middleware/csrf.py#L76 Aussi' '.mainsite.com'' Le paramètre est pour tous les sous-domaines, vous devez le définir comme suit: 'CSRF_COOKIE_DOMAIN = 'app.mainsite.com'' –

Répondre

1

Turned out, it was a bug in the Ubuntu build of Chromium. Ouais, j'utilisais Chrome (et je utiliser Ubuntu comme mon OS) Ce lien plnkr que cette personne a fourni dans le problème, cela n'a pas fonctionné dans Chromium. Mais cela a bien fonctionné dans Chrome et Firefox

J'ai également testé mon application dans Chrome et Firefox; fonctionne comme avant.

0

vous pouvez essayer d'ajouter décorateur @csrf_exempt autour de la vue qui sert la réponse ... mais bien sûr, cela désactive la vérification CSRF ...

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def your_view(request): 
    ... 
+0

Je vérifie si l'utilisateur est connecté. Sinon, il/elle est redirigé vers la page de connexion. Ce n'est pas exempté csrf. J'ai essayé, mais ça n'a pas marché. Je dois exempter la vue de formulaire de connexion de django, mais je ne peux pas faire cela. –

+0

hmm ... eh bien, vous pourriez complètement désactiver la vérification CSRF pour l'ensemble du site ... selon le doc, ce n'est pas recommandé mais peut être fait ... (https://docs.djangoproject.com/fr/dev/ ref/csrf /) il suffit de supprimer 'django.middleware.csrf.CsrfViewMiddleware' de MIDDLEWARE_CLASSES dans les paramètres –

+0

IMHO, exemption de csrf est un hack et non une réponse à cette question. Et comme l'auteur a mentionné qu'il travaillait sur IP publique, mais pas sur sous-domaine, le problème est autre chose. –