zoukankan      html  css  js  c++  java
  • 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}

    我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证。但是,当我尝试登录时,我收到以下响应:

    403: CSRF Failed: CSRF token missing or incorrect.
    

    该请求将发送给http://localhost/rest-auth/google/以下机构:

    access_token: <the OAuth token from Google>
    

    什么可能导致这个?客户端没有CSRF令牌,因为要进行身份验证的POST是客户端和服务器之间首先发生的事情。我检查了很多过去的问题同样的问题,但我找不到任何解决方案。

    Django方面的相关设置如下:

    AUTHENTICATION_BACKENDS = (
        "django.contrib.auth.backends.ModelBackend",
        "allauth.account.auth_backends.AuthenticationBackend"
    )
    
    TEMPLATE_CONTEXT_PROCESSORS = (
        "django.core.context_processors.request",
        "django.contrib.auth.context_processors.auth",
        "allauth.account.context_processors.account",
        "allauth.socialaccount.context_processors.socialaccount"
    )
    
    MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
    )
    
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app',
        'allauth',
        'allauth.account',
        'allauth.socialaccount',
        'allauth.socialaccount.providers.facebook',
        'allauth.socialaccount.providers.google',
    
        'django.contrib.admin',
    
        # REST framework
        'rest_framework',
        'rest_framework.authtoken',
        'rest_auth',
        'rest_auth.registration',
    )
    
    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': ( 
            'rest_framework.permissions.IsAuthenticated'
        ),
    }
    

    django django-rest-framework csrf django-allauth django-rest-auth 
     | 
      这个问题是
    2015年 9月16日7:15问题 manabreak 1,858 1 12 38



     | 

    答案
    2

    你为什么会收到这个错误?

    由于您尚未AUTHENTICATION_CLASSES在设置中定义,DRF使用以下默认身份验证类。

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    )
    

    现在,SessionAuthentication强制使用CSRF Token如果未传递有效的CSRF令牌,则会引发403错误。

    如果您使用的是AJAX风格的API有SessionAuthentication,你需要确保你有一个有效的CSRF令牌任何“不安全”的HTTP方法调用,如PUTPATCHPOSTDELETE请求。

    那你需要做什么?

    由于您正在使用TokenAuthentication,您需要AUTHENTICATION_CLASSES在DRF设置中明确定义它这应该可以解决您的CSRF令牌问题。



      这个答案
     编辑于2015年 9月16日16:45回答2015年 9月16日7:27 Rahul Gupta 17k 2 25 33你说我们必须传递一个有效的CSRF令牌。我在哪里可以找到这个令牌?在我的情况下,当我尝试使用端点登录时出现问题 但它是客户端和服务器之间的第一次联系,因此客户端不知道令牌。-  Ben Jan 4 at 13:37检查这个Django docs链接以获取Ajax请求的CSRF令牌。-  Rahul Gupta 1月4日14:34谢谢@ rahul-gupta,但我不在网络环境中。我在ac#environment(Xamarin)。但无论如何,在休息<>客户端应用程序中,如果服务器没有告诉他,客户端就无法知道csrf。-  rest-auth/login/BenJan 4 at 17:31然后您应该使用不同的身份验证类,因为SessionAuthentication需要发送CSRF令牌。您需要在设置或特定视图中明确定义该特定身份验证类。-  Rahul Gupta 1月4日17:59



     |  解决方法

    傻了,我错过TokenAuthentication了REST设置中框架:

    settings.py

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

    现在它按预期工作。

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/yunlongaimeng/p/9807844.html
Copyright © 2011-2022 走看看