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

403: CSRF Failed: CSRF token missing or incorrect.

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

access_token: <the OAuth token from Google>

什么可能导致这个?客户端没有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'
),
}

djangodjango-rest-frameworkcsrfdjango-allauthdjango-rest-auth   |   这个问题是在2015年 9月16日7:15问题 manabreak 1,858 1 12 38



|

2 答案
2

你为什么会收到这个错误?

由于您尚未AUTHENTICATION_CLASSES在设置中定义,DRF使用以下默认身份验证类。

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

现在,SessionAuthentication强制使用CSRF Token。如果未传递有效的CSRF令牌,则会引发403错误。

如果您使用的是AJAX风格的API有SessionAuthentication,你需要确保你有一个有效的CSRF令牌任何“不安全”的HTTP方法调用,如PUT,PATCH,POST或DELETE请求。

那你需要做什么?

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

现在它按预期工作。

解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}的更多相关文章

  1. Apache2.4部署django出现403 Forbidden错误解决办法

    前言:Apache2.4部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹 ...

  2. 解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法

    我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log.打开日志发现报错Permissio ...

  3. Centos75 解决Nginx出现403 forbidden(13: Permission denied)

    Centos75 新安装的vm,nginx出现403 forbidden 一般为SELinux设置为开启状态(enabled)的原因 切为root ,执行: sed -i 's/SELINUX=enf ...

  4. Linux下解决apache 报 403 forbidden 错

    三步搞定: 1. 打开终端 2. 输入 chcon -R -t httpd_sys_content_t /var/www/html # 后面的/var/www/html是网站的默认目录,可以根据自己的 ...

  5. 解决Nginx出现403 forbidden

    在之前我修改了nginx.conf,所以/home/ftpuser/www文件夹下应该有index.html或index.htm文件 将index.html或index.htm文件复制到/home/f ...

  6. Django 如何让ajax的POST方法带上CSRF令牌

    问题 大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提 ...

  7. nginx “403 Forbidden” 错误的原因及解决办法

    nginx 的 403 Forbidden errors 表示你在请求一个资源文件但是nginx不允许你查看. 403 Forbidden 只是一个HTTP状态码,像404,200一样不是技术上的错误 ...

  8. 对于 前端请求Django 后端服务出现403 Forbidden (CSRF token missing or incorrect.) 问题的解析

    Django中使用ajax post向後臺傳送資料時403 Forbidden (CSRF token missing or incorrect.):的解決辦法 在Django中使用ajax post ...

  9. 解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式

    众所周知前端向后台发送 post 请求时,必须验证 csrf,否则会报错 403 Forbidden.使用 Django Form 表单可以直接在表单里面添加 {% csrf_token %} 即可, ...

随机推荐

  1. Ubuntu16.04安装最新版nodejs

    原文链接:https://www.jianshu.com/p/2b24cd430a7d

  2. 解决 Qt5 报错 This application failed to start because it could not find or load the Qt platform plugin

    QT为了简化生成发布版本,特别提供了工具 "windeplayqt.exe",这个工具在 "...\Qt5.8.0\5.8\msvc2015_64\bin"的目 ...

  3. Linux查看本机IP:curl cip.cc

    curl http://members.3322.org/dyndns/getip curl ip.6655.com/ip.aspx curl ifconfig.me curl icanhazip.c ...

  4. Linux的notifier机制在TP中的应用【转】

    转自:https://blog.csdn.net/armfpga123/article/details/51771666 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  5. 10 个 MySQL 经典错误【转】

    Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...

  6. Python在线聊天软件(Tkinter)

    1.python2.7下安装 apt-get install python-tk 主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点: 1.Python Socket:2.Pytho ...

  7. 【转】Leveldb源码分析——1

    先来看看Leveldb的基本框架,几大关键组件,如图1-1所示. Leveldb是一种基于operation log的文件系统,是Log-Structured-Merge Tree的典型实现.LSM源 ...

  8. 用Openssl计算ECDSA签名

    ECDSA的全名是Elliptic Curve DSA,即椭圆曲线DSA.它是Digital Signature Algorithm (DSA)应用了椭圆曲线加密算法的变种.椭圆曲线算法的原理很复杂, ...

  9. linux无法启动httpd服务问题

    httpd 服务启动报错,可能出现的问题比较多,通过查看日志看是什么报错 (tail  200f /etc/httpd/logs/error_log) 1.查看防火墙是不是关闭状态 2.查看80端口是 ...

  10. 最新版Kali Linux虚拟机安装Open-vm-tools替代VMware tools

    自从Kali 2.0发布之后,会经常遇到安装vmware tools无法成功,或者提示安装成功了但是仍旧无法进行文件拖拽.复制和剪切的问题. 今天给新电脑装系统,重新下载了最新版,Kali 2017. ...