2017-05-04 104 views
0

你好我正在使用django rest-auth,并且我在/ password/change /中有这个问题/ allways返回csrf令牌丢失或不正确的问题: 我正在请求一个android应用我发展 我的设置是:django rest框架csrf令牌丢失或不正确

INSTALLED_APPS = [ 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.sites', 

'rest_framework', 
'rest_framework.authtoken', 

'rest_auth', 
'rest_auth.registration', 

'allauth', 
'allauth.account', 
'allauth.socialaccount', 

]

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

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

版本: Django的休息-auth的== 0.9.1

djangorestframework == 3.6.2

+1

解释你是如何执行的请求,使用形成的?您需要将该令牌添加到表单中。 – Todor

+0

@Todor I'v编辑了这个问题,请求是由Android应用程序 –

+0

看看这个问题:http:// stackoverflow。com/questions/27997483/which-authentication-to-be-used-when-using-django-rest-framework-and-ios-app – Todor

回答

0

阅读Django的REST框架官我的文档和大量的帮助从何而来@Todor comment后,我意识到,我应该只放TokenAuthentification在其他认证类,因为sessionAuthentication期望在请求中的CSRF值,但机器人可以” t给予,所以我使用每个请求中的doc令牌,就是这样!

-1

那么解决方案很简单:您需要在提出请求时添加CSRF token。您将如何做到这一点,具体而言,我们无法回答,因为我们不知道您是如何提出请求的。即显示一些代码

+0

请求是由android应用程序构成的我已经注意到要处理的表单或模板从应用程序中调用API端点 –

+0

@amirhattab显示您用来调用端点的代码。 – smilebomb

+0

Ion.with(this).load(“POST”,“http://127.0.0.1:8000/auth/password/change/”) –

0

您是否正确存储和转发来自Android网络库的Cookie?我有离子/ Android的非常少熟悉,但Django的CSRF检查的工作方式是这样的:

  • 检查一个CSRF令牌被设置在主体为csrfmiddlewaretoken
  • 如果没有这样的参数存在,检查一个cookie叫csrftoken
  • 如果没有这样的cookie存在,回落到HTTP_X_CSRFTOKEN

cookie的名称和标题名称可以在设置中进行定制。

所以我得到的是,你用什么方法发送CSRF令牌?在移动设备上,由于客户端生成表单(在Web上,Django生成表单并注入CSRF标记),因此通常很难为请求获取CSRF标记。也就是说,让端点CSRF免除也很常见,看起来你对这些端点使用第三方库,所以我不确定它为什么需要CSRF令牌。您可以检查项目的文档。

另一种可能性是您已经在该URL绑定了自己的视图,并且您正在到达该视图而不是正在使用的库。这很难说。你为什么不先用DRF的Browsable API来尝试请求?

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

从DEFAULT_AUTHENTICATION_CLASSES删除'rest_framework.authentication.SessionAuthentication',如果你仍然需要DRF可浏览API来看,在Chrome中使用ModHeader

相关问题