我正在构建一个使用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的,因此可能无法从客户端显示引用标头?