我正在使用cordova构建一个应用程序,后端使用django rest框架和django rest-auth(用于提供和django all-auth,用于提供REST api注册/登录端点)。我也在使用 django allauth,但可能与这个问题无关。
当我尝试通过 rest-auth 提供的 rest-auth/login 端点登录时,我收到 403 错误消息:
“CSRF 验证失败。请求中止。您看到此消息是因为此 HTTPS 站点要求您的 Web 浏览器发送一个 'Referer 标头',但没有发送....”
我正在使用 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',
)
令人惊讶的是,它过去一直为我工作,直到现在它也可以在调试模式下工作(本地主机上的开发服务器)。据我了解,即使在调试模式下,csrf 验证也未被禁用,因此即使使用调试模式服务器,csrf 验证也应该失败。
为什么它需要带有令牌身份验证的Referer 标头,并且由于该应用程序是基于cordova 的,因此客户端可能不会提供referer 标头?