2016-04-29 4 views
0

У меня IdP инициировал настройку SSO, где кто-либо просматривал https://www.xxxxxx.com, перенаправляется для аутентификации на https://www.yyyyyy.com и после успешного хоста аутентификации yyyyyy.com POST ответ SAML на обратный вызов URL https://www.xxxxxx.com/SAML.Мне действительно нужно csrf_exempt в представлении приложения django?

urls.py

url(r'^SAML$', views.index, name='index'), 
url(r'^home$', views.home, name='home'), 
url(r'^$', RedirectView.as_view(url='https://www.yyyyyy.com', permanent=True)), 

views.py

@csrf_exempt 
def index(request): 
    if request.method == 'POST': 
     ... 
     ... 
     return redirect('/home') 
    else: 
     return redirect('/') 


@login_required(login_url='/') 
def home(request): 
    return render(request, 'myapp/index.html') 

settings.py

CSRF_TRUSTED_ORIGINS = ['yyyyyy.com'] 

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.middleware.cache.UpdateCacheMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.common.BrokenLinkEmailsMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.cache.FetchFromCacheMiddleware', 
] 

Все работает, когда я использую csrf_exempt на индексном но если удалить csrf_exempt я получить Cookie Not Set ошибка. У меня есть 2 вопроса,

  1. Действительно ли мне нужен csrf_exempt на моем индексном представлении? Или есть другой рекомендуемый способ?
  2. Является ли заказ для WhiteNoiseMiddleware и BrokenLinkEmailsMiddleware правильным?

Я использую Django == 1.9.5 и Python 3.5.1

+0

Заказ промежуточного ПО представляет собой отдельный вопрос, нужен ли 'csrf_exempt'. [Whitenoisedocs] (http://whitenoise.evans.io/en/stable/#quickstart-for-django-apps) говорят, что промежуточное программное обеспечение должно быть, прежде всего, промежуточным программным обеспечением, кроме промежуточного программного обеспечения безопасности, но у вас оно под «UpdateCacheMiddleware». В [отчетах об ошибках] (https://docs.djangoproject.com/en/1.9/howto/error-reporting/#errors) говорится, что неработающий декодер электронной почты должен отображаться над другим промежуточным программным обеспечением, которое перехватывает 404 ошибки. Кажется, у вас нет ни одного из них, так что это выглядит хорошо для меня. – Alasdair

ответ

0

Django проверяет, что маркер CSRF в request.POST (в заголовке для AJAX запросов) совпадает с куки CSRF.

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