解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}

 

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

403: CSRF Failed: CSRF token missing or incorrect. 

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

access_token: <the OAuth token from Google> 

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

Django方面的相关设置以下:api

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安全



 | bash

答案
2

你为何会收到这个错误?服务器

因为您还没有AUTHENTICATION_CLASSES在设置中定义,DRF使用如下默认身份验证类。网络

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

如今,SessionAuthentication强制使用CSRF Token若是未传递有效的CSRF令牌,则会引起403错误。session

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

那你须要作什么?

因为您正在使用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', ) } 

如今它按预期工做。

相关文章
相关标签/搜索