2015-04-10 4 views
1

Мое приложение хорошо работало до сих пор, когда все было сделано путем доступа к его публичному IP.Django csrf cookie не установлен для поддомена при доступе в iframe на стороннем сайте

Теперь он добавляется на главный сайт, как app.mainsite.com. Доступно так. Я могу войти и т. Д., Все.

Но мое приложение немного отличается тем, что определенная функция позволяет его пользователям открывать один из своих URL-адресов в iframe на любом стороннем сайте, где скрипты приложения встроены в html, чтобы сделать некоторые приложения конкретными деятельность на тех сторонних сайтах. Теперь все могли видеть новые материалы, которые приложение приносило этим сторонним сайтам, но чтобы изменить некоторые настройки относительно того, как нужно было войти в мое приложение. Если нет, можно было бы перенаправить внутри самого модала, и если логин был успешным, они были бы перенаправлены на страницу редактирования параметров. В принципе, любые запросы на запись с сторонних сайтов потребовали, чтобы владелец сайта был зарегистрирован в нашем приложении. Либо они могут войти в модальный, либо войти в систему с другой вкладки, а затем обновить свой сайт, чтобы иметь возможность войти в представление редактирования.

Проблема в том, что раньше все это работало отлично. Теперь я могу писать сообщение с токенами csrf с сайта app.mainsite.com, но когда он открывается в iframe, он выдает CSRF cookie not set.

Я проверил вкладку «Ресурсы», и в этом случае csrftoken в app.mainsite.com не соответствует csrfmiddlewaretoken в форме. Очевидно, что CSRF не работает.

Как я могу это преодолеть?

Я попытался установить CSRF_COOKIE_DOMAIN='.mainsite.com', но это не сработало.

Что я могу сделать?

+0

Я понимаю вашу проблему, но я не уверен, что смогу помочь, не исследуя, как работает ваше приложение. Мне не приходилось обрабатывать запросы POST из iframe, встроенного в сторонний сайт, но похоже, что он должен работать нормально. Я бы начал с рассмотрения 'CsrfViewMiddleware' и выяснил, где именно это происходит: https://github.com/django/django/blob/master/django/middleware/csrf.py#L76 Также' '.mainsite.com'' настройка для всех поддоменов, вы должны установить его: 'CSRF_COOKIE_DOMAIN = 'app.mainsite.com'' –

ответ

1

Turned out, it was a bug in the Ubuntu build of Chromium. Да, я использовал Хром (и я используйте Ubuntu в качестве моей ОС). Эта ссылка plnkr, предоставленная этим человеком, не работает в Chromium. Но он отлично работал в Chrome и Firefox

Протестировано и мое приложение в Chrome и Firefox; работает так же, как и раньше.

0

вы можете попробовать добавить @csrf_exempt декоратора вокруг точки зрения, что служит ответ ... но, конечно, это будет отключить проверку CSRF ...

from django.views.decorators.csrf import csrf_exempt 

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

Я проверяю, зарегистрирован ли пользователь. Если нет, он перенаправляется на страницу входа. Это не освобождение csrf. Я попробовал, но это не сработало. Я должен освободить вид формы входа в django, но я не могу этого сделать. –

+0

hmm ... ну, вы можете полностью отключить проверку CSRF для всего сайта ... согласно документу, это не рекомендуется, но может быть сделано ... (https://docs.djangoproject.com/en/dev/ ref/csrf /) просто удалите 'django.middleware.csrf.CsrfViewMiddleware' из MIDDLEWARE_CLASSES в настройках –

+0

IMHO, освобождение csrf - это взлом, а не ответ на этот вопрос. И поскольку автор упомянул, что он работал над публичным ip, но не в поддомене, проблема в другом. –

Смежные вопросы