在django app视图中我真的需要csrf_exempt吗?

时间:2016-04-29 06:07:32

标签: python django django-csrf

我有IdP启动了SSO设置,其中任何浏览https://www.xxxxxx.com的人都被重定向到https://www.yyyyyy.com进行身份验证,并且在成功验证主机yyyyyy.com后将SAML响应发送回回调URL https://www.xxxxxx.com/SAML

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的订购是否正确?
  3. 我正在使用Django == 1.9.5和Python 3.5.1

2 个答案:

答案 0 :(得分:0)

Django检查request.POST中的CSRF令牌(在ajax请求的标头中)是否与CSRF cookie匹配。

对于此视图,发布请求来自不同的域,该域不具有传递CSRF检查所需的令牌。因此,您需要将csrf_exempt用于此视图。

答案 1 :(得分:0)

是的,您需要使用csrf_exempt装饰器,因为每次它传递csrf令牌以检入POST请求时,登录时都不必传递csrf令牌。

有时可能会因缺少csrf或登录时输入错误而导致异常。

因此作为代码放置:

@csrf_exempt
def login_to_page():

refer tutorial