我有一个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

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

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

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

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

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

那你需要做什么?

由于您正在使用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. 2017-2018-2 20165237 实验二《Java面向对象程序设计》实验报告

    ##2017-2018-2 20165237 实验二<Java面向对象程序设计>实验报告 No.1 实验要求: 实验三 敏捷开发与XP实践 http://www.cnblogs.com/r ...

  2. CF1100F Ivan and Burgers

    题目地址:CF1100F Ivan and Burgers 一道有难度的线性基题,看了题解才会做 预处理两个数组: \(p_{r,i}\) 表示满足下列条件的最大的 \(l\) :线性基第 \(i\) ...

  3. linux 用户密码到期导致ftp业务失败

    外网反馈某业务失败,查看log发现FTP连接失败,定位发现提示密码不对,重新修改FTP密码后恢复正常. 但同时定位了下FTP密码被修改的原因,发现是密码过期了,因此查了下资料,查得修改过期时间的方法 ...

  4. SQL Server Profiler 常见问题总结

    1.跟踪指定数据库 SELECT DB_ID('数据名称') 原文:https://jingyan.baidu.com/article/647f0115be128a7f2048a87d.html 2. ...

  5. 解决genymotion-arm-translation.zip无法拖拽安装的问题

    1.问题由来 适用情况一:当我们启动了Genymotion模拟器后,在AndroidStudio运行app时,弹出如下错误: INSTALL_FAILED_CPU_ABI_INCOMPATIABLE ...

  6. xtrabackup

    mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了.而使 ...

  7. 添加struts2本地dtd限制

    将源码保重的struts-2.1.7.dtd文件拷贝到dtds文件夹中 打开eclipse配置文件window/preferences,搜索xml找到XML Catalog

  8. 转-C语言中.h和.c文件解析

    C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词 ...

  9. Fragment与Acitvity通信

    Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为F ...

  10. SQL Server 之 子查询与嵌套查询

    当由where子句指定的搜索条件指向另一张表时,就需要使用子查询或嵌套查询. 1 子查询 子查询是一个嵌套在select.insert.update或delete语句或其他子查询中的查询.任何允许使用 ...