【问题标题】:Django error, CSRF Failed: CSRF token missing or incorrectDjango 错误,CSRF 失败:CSRF 令牌丢失或不正确
【发布时间】:2020-09-19 17:49:16
【问题描述】:

我有后端 = Django+Django Rest+Djoser(基于令牌的用户身份验证应用程序) Fontend = React JS + Axios。

在本地主机/开发中,我可以使用令牌进行用户登录和身份验证。 Postman 也没有报错。

在生产模式下,由于 CSRF 失败而报错。

为什么会这样?

我认为 CSRF 令牌只需要在会话身份验证中。

我尝试删除会话身份验证,但导致服务器崩溃

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
   ....
}

中间件

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

已安装的应用程序

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'shop',
    'corsheaders',
    'frontend',
    'djoser',
    'rest_framework.authtoken',
    'users'
]

【问题讨论】:

  • 你是在应用还是网页上使用这个api?
  • web 应用程序的 api(它不会刷新),我不需要会话身份验证。如何全局禁用 csrf 令牌?

标签: django django-rest-framework


【解决方案1】:

settings.py 中添加以下行:

REST_FRAMEWORK = {
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
   )
}

或者,如果您已经在 settings.py 文件中添加了这些行,则从 settings.py 中找到并删除以下行:

rest_framework.authentication.SessionAuthentication

来源:https://khalsalabs.com/disable-csrf-verification-for-django

【讨论】:

    【解决方案2】:

    现在要禁用 csrf 检查,您可以创建一个自定义身份验证类 CsrfExemptSessionAuthentication,它扩展自默认的 SessionAuthentication 类。在这个身份验证类中,我们将覆盖在实际 SessionAuthentication 中发生的 enforce_csrf() 检查。

    from rest_framework.authentication import SessionAuthentication, TokenAuthentication
    
    class CsrfExemptSessionAuthentication(SessionAuthentication):
    
        def enforce_csrf(self, request):
            return  # To not perform the csrf check previously happening
    

    在您看来,那么您可以将authentication_classes 定义为:

    authentication_classes = (CsrfExemptSessionAuthentication, TokenAuthentication)
    

    这应该会处理 csrf 错误。

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 2021-07-14
      • 2021-06-04
      • 1970-01-01
      • 2014-02-26
      • 2021-10-01
      • 2014-09-10
      • 2017-09-10
      • 2021-11-13
      相关资源
      最近更新 更多