解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}
我有一个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."}的更多相关文章
- Apache2.4部署django出现403 Forbidden错误解决办法
前言:Apache2.4部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹 ...
- 解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法
我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log.打开日志发现报错Permissio ...
- Centos75 解决Nginx出现403 forbidden(13: Permission denied)
Centos75 新安装的vm,nginx出现403 forbidden 一般为SELinux设置为开启状态(enabled)的原因 切为root ,执行: sed -i 's/SELINUX=enf ...
- Linux下解决apache 报 403 forbidden 错
三步搞定: 1. 打开终端 2. 输入 chcon -R -t httpd_sys_content_t /var/www/html # 后面的/var/www/html是网站的默认目录,可以根据自己的 ...
- 解决Nginx出现403 forbidden
在之前我修改了nginx.conf,所以/home/ftpuser/www文件夹下应该有index.html或index.htm文件 将index.html或index.htm文件复制到/home/f ...
- Django 如何让ajax的POST方法带上CSRF令牌
问题 大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提 ...
- nginx “403 Forbidden” 错误的原因及解决办法
nginx 的 403 Forbidden errors 表示你在请求一个资源文件但是nginx不允许你查看. 403 Forbidden 只是一个HTTP状态码,像404,200一样不是技术上的错误 ...
- 对于 前端请求Django 后端服务出现403 Forbidden (CSRF token missing or incorrect.) 问题的解析
Django中使用ajax post向後臺傳送資料時403 Forbidden (CSRF token missing or incorrect.):的解決辦法 在Django中使用ajax post ...
- 解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
众所周知前端向后台发送 post 请求时,必须验证 csrf,否则会报错 403 Forbidden.使用 Django Form 表单可以直接在表单里面添加 {% csrf_token %} 即可, ...
随机推荐
- 什么是openstack
什么是openstack OpenStack是一个云平台管理的项目,它不是一个软件. 这个项目由几个主要的组件组合起来完成一些具体的工作. 想要了解openstack,第一步我们可以观察他的概念图: ...
- VMware下CentOS7设置网络以及修改系统语言
1.在VMware里,依次点击”编辑“ - ”虚拟网络编辑器“,如下图,我选择的是NAT模式 为了能够使用静态IP,这里不要勾选”使用本地DHCP服务将IP分配给虚拟机“这个选项.然后是配置子网ip, ...
- P2805 [NOI2009]植物大战僵尸
题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...
- html5离线记事本
离线记事本 这是一个笔记应用,不需要联网,也不需要数据库,可以直接把数据储存在本地.方便易用! ^_^ <!DOCTYPE html> <html> <head> ...
- Trickbot展示新技巧:密码抓取器模块
Trickbot是一个简单的银行木马 来源 https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remo ...
- python异步编程模块asyncio学习(二)
尽管asyncio应用通常作为单线程运行,不过仍被构建为并发应用.由于I/O以及其他外部事件的延迟和中断,每个协程或任务可能按一种不可预知的顺序执行.为了支持安全的并发执行,asyncio包含了thr ...
- 无线桥接(WDS)如何设置?
一.WDS使用介绍 无线桥接(WDS)可以将多台无线路由器通过无线方式互联,从而将无线信号扩展放大.无线终端在移动过程中可以自动切换较好的信号,实现无线漫游. 本文指导将TL-WR740N当作副路由器 ...
- centos7怎么永久修改hosname
centos7怎么永久修改hosname 其实,一般来说安装好虚拟机之后,一般都会进行修改hostname,之前也是在修改的时候,遇到过问题,但是没有深究,今天在修改的时候,好好研究了一下,之前看到好 ...
- STM32F1-GPIO的操作
GPIO 即通用输入输出口.凡事都要熟悉,熟能生巧.一定要掌握MDK软件的工程操作方法. 对于GPIO的操作. Project里面要有以下几个文件夹(开发之前需要包含相应的库文件,这里默认已经包含) ...
- 构造函数中base与this的区别
base是对父类的引用,而this是对类本身的引用. namespace ConsoleApplication1 { public class BaseClass { private string n ...