0

我正在使用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 标头?

4

0 回答 0