CSRF验证失败:缺少与cordova和djangorestframework的referer头错误

时间:2015-11-03 18:07:07

标签: django cordova django-rest-framework csrf django-rest-auth

我正在构建一个使用cordova的应用程序,后端用django rest框架和django rest-auth实现(用于提供和django all-auth以提供REST api注册/登录端点)。我也在使用django allauth但可能与这个问题无关。

当我尝试通过rest-auth提供的rest-auth / login端点登录时,收到403错误消息:

" CSRF验证失败。请求中止。 您看到此消息是因为此HTTPS站点需要' Referer标头'由您的Web浏览器发送,但没有发送.... "

我正在使用DRF提供的基于令牌的身份验证,我对DRF和中间件的设置是:

REST_FRAMEWORK = {                                                                                  
    'DEFAULT_AUTHENTICATION_CLASSES': (                                                             
        'rest_framework.authentication.TokenAuthentication',                                        
        'rest_framework.authentication.BasicAuthentication',                                        
        'rest_framework.authentication.SessionAuthentication',                                      
    ),                                                                                              
    'DEFAULT_PERMISSION_CLASSES': [                                                                 
        #'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'                          
        'rest_framework.permissions.IsAuthenticated',                                               
    ],                                                                                              
    'PAGE_SIZE': 10,                                                                                
}   

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
)

MIDDLEWARE_CLASSES += (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

令人惊讶的是,它过去一直用于我,直到现在它也适用于调试模式(localhost上的开发服务器)。根据我的理解,即使在调试模式下,csrf验证也未被禁用,因此即使使用调试模式服务器,csrf验证也应该失败。

为什么它需要带有令牌身份验证的Referer标头,并且由于该应用程序是基于cordova的,因此可能无法从客户端显示引用标头?

0 个答案:

没有答案