我有一個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
你爲何會收到這個錯誤?服務器
因爲您還沒有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方法調用,如PUT
,PATCH
,POST
或DELETE
請求。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', ) }
如今它按預期工做。