man*_*eak 4 django csrf django-rest-framework django-allauth django-rest-auth
我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我得到以下响应:
403: CSRF Failed: CSRF token missing or incorrect.
Run Code Online (Sandbox Code Playgroud)
该请求将发送给http://localhost/rest-auth/google/以下机构:
access_token: <the OAuth token from Google>
Run Code Online (Sandbox Code Playgroud)
什么可能导致这个?客户端没有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'
),
}
Run Code Online (Sandbox Code Playgroud)
你为什么会收到这个错误?
由于您尚未AUTHENTICATION_CLASSES在设置中定义,DRF使用以下默认身份验证类.
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
)
Run Code Online (Sandbox Code Playgroud)
现在,SessionAuthentication强制使用CSRF Token.如果未传递有效的CSRF令牌,则会引发403错误.
如果您使用的是AJAX风格的API有
SessionAuthentication,你需要确保你有一个有效的CSRF令牌任何"不安全"的HTTP方法调用,如PUT,PATCH,POST或DELETE请求.
那你需要做什么?
由于您正在使用TokenAuthentication,您需要AUTHENTICATION_CLASSES在DRF设置中明确定义它.这应解决您的CSRF令牌问题.
愚蠢的我,我错过TokenAuthentication了 REST 设置中的框架:
设置.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
)
}
Run Code Online (Sandbox Code Playgroud)
现在它按预期工作。
| 归档时间: |
|
| 查看次数: |
4244 次 |
| 最近记录: |