2017-05-04 147 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

相關問題