我想从使用Axios的React应用程序向Django Rest Framework后端发出POST请求。我设法从后端获取了CSRF 令牌,但我无法通过我的请求发送它,所以我总是收到错误消息:Forbidden (CSRF cookie not set.)
这是我的React应用程序的代码:
handleClick() {
const axios = require('axios');
var csrfCookie = Cookies.get('XSRF-TOKEN');
console.log(csrfCookie)
axios.post('http://127.0.0.1:8000/es/api-auth/login/',
{
next: '/',
username: 'admin@admin.com',
password: 'Cancun10!',
},
{
headers: {
'x-xsrf-token': csrfCookie, // <------- Is this the right way to send the cookie?
},
withCredentials = true,
}
)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
}
Run Code Online (Sandbox Code Playgroud)
这是我的settings.pyCSRF 配置:
CORS_ALLOW_CREDENTIALS …Run Code Online (Sandbox Code Playgroud) 我和一个没有任何Django经验的iPhone开发人员合作,而且我对Django来说比较新.我已经构建了一个带有Web界面的现有Django应用程序,允许用户登录并将我们数据库中的书籍添加到他的个人库中.
我们正在尝试构建一个允许用户进行身份验证和访问库的iPhone应用程序,我想知道进行身份验证的最佳方法是什么,然后请求用户的库.我们开始使用HTTP POST请求将凭据发送到Django应用程序,但我知道的另一个Django开发人员告诉我这将是一个跨域请求,从Django 1.2开始无法工作.
如果我无法进行跨域HTTP POST请求,我应该如何将数据从iPhone应用程序发布到Django应用程序?
我从iPhone发送POST请求到Django并获得"CSRF验证失败",我无法完全理解.我试图通过互联网找到一个很好的解决方案,但我不能.是否有任何简单的方法来发送到Django?
这是我的代码:
NSString *post =[NSString stringWithFormat:@"s=aaa&r=k&c=gg"];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:(@"http://localhost:8000/messages/views/")]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(data);
Run Code Online (Sandbox Code Playgroud) 我有一个Python程序,需要能够将数据发送到我的网站(使用Django构建).然后,这些数据将被拍摄并显示在网站的某个部分.我遇到的问题是Django内置的CSRF保护阻止了我的POST请求.根据我的理解,通常可以通过将{%csrf_token}添加到POST请求发送到的任何形式来避免这种情况.我的问题是我正在尝试将POST请求发送到.cgi脚本而不是表单.有没有人知道如何绕过CSRF保护(最好不要完全删除它,尽管这是一个选项.)
我在http://example.com上有一个Django网站,工作正常,包括帖子请求.我添加了HTTPS,因此我的网站也可以通过https://example.com访问.
我可以在HTTPS上加载任何页面,但是当我尝试POST时,我总是遇到CSRF验证错误.POST请求在HTTP上正常工作.
我的Django进程在nginx后面运行gunicorn,我有nginx设置X_Forwarded_For.因此,HTTPS请求具有以下标头(取自request.META):
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
'HTTP_CONNECTION': 'close',
'HTTP_COOKIE': 'redacted',
'HTTP_HOST': 'example.com:80',
'HTTP_REFERER': 'https://example.com/user/delete/49/',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0',
'HTTP_X_FORWARDED_FOR': '1.2.3.4, 192.168.252.22',
'HTTP_X_FORWARDED_PROTO': 'https',
'HTTP_X_REAL_IP': '1.2.3.4',
Run Code Online (Sandbox Code Playgroud)
并且HTTP请求具有以下标头:
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
'HTTP_CONNECTION': 'close',
'HTTP_COOKIE': 'redacted',
'HTTP_HOST': 'example.com.com:80',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0',
'HTTP_X_FORWARDED_FOR': '1.2.3.4, 192.168.252.22',
'HTTP_X_FORWARDED_PROTO': 'http',
'HTTP_X_REAL_IP': '1.2.3.4',
Run Code Online (Sandbox Code Playgroud)
当我在HTTP上没有问题时,为什么CSRF不能在HTTPS上工作?
我正在为移动应用程序制作后端,并使用Django和Userena进行用户管理.我使用Django REST框架进行登录并注册,一切正常.我现在唯一需要做的就是实现"忘记密码"功能.我想使用已经实现的Userena,但是即使在使用csrf_exemptdectorator 之后我也无法摆脱"CSRF令牌丢失或错误"的错误.我在做什么?
urls.py
from django.contrib.auth.views import password_reset
from django.views.decorators.csrf import csrf_exempt
...
urlpatterns = patterns(
'',
url(r'^password/mobile/reset/$',
csrf_exempt(password_reset),
{'template_name': 'userena/password_reset_form.html',
'email_template_name': 'userena/emails/password_reset_message.txt',
'extra_context': {'without_usernames': userena_settings.USERENA_WITHOUT_USERNAMES}
},
name='userena_password_mobile_reset'),
)
Run Code Online (Sandbox Code Playgroud)
passowrd_reset_form.html
{% extends 'userena/base_userena.html' %}
{% load i18n %}
{% block title %}{% trans "Reset password" %}{% endblock %}
{% block content %}
<form action="" method="post">
<fieldset>
<legend>{% trans "Reset Password" %}</legend>
{% csrf_token %}
{{ form.as_p }}
</fieldset>
<input type="submit" value="{% trans "Send password" %}" />
</form>
{% …Run Code Online (Sandbox Code Playgroud) 我使用django作为我的后端做了一些移动应用程序,现在我正在开发一个chrome扩展程序.我希望我的用户能够使用app/extension将POST请求发送到服务器,但有没有办法在没有首先向服务器请求CSRF令牌的情况下执行此操作?它只是保存应用程序每次我们想要提交数据时发出两个请求.例如,我想在我的社交媒体应用上更新我的个人资料或从Chrome扩展程序更新钱包.打开配置文件视图输入数据并将其推送到服务器会很不错.如果我必须打开配置文件,然后等待它从服务器获取令牌然后我可以提交数据,它就不那么光滑了.还有另一种方法吗?或者我每次想要提交数据时都会发出多个请求?
此外,一点点澄清,CSRF阻止网站提交包含用户数据的表单.但是什么阻止我创建一个使用ajax或其他东西的网站来获取真实网站并窃取CSRF令牌然后将其粘贴到我的跨站点请求表单中?我觉得这里有一个漏洞.我知道我一直都不太了解这一点.
我有AJAX代码,可向Django 1.6.4应用程序发出POST请求。该视图通过启用了CSRF保护django.middleware.csrf.CsrfViewMiddleware。如果我没有传递cookie,但是传递了HTTP_X_CSRFTOKEN,则它将失败。
我正在查看的代码,django.middleware.csrf.CsrfViewMiddleware并且在161行上看到它会检查是否if csrf_token is None:从cookie中获取了代码。如果为None,则返回。之后才检查csrfmiddlewaretoken参数和HTTP_X_CSRFTOKEN请求标头。这看起来是不正确的,只有在检查了所有可能的位置后才能检查csrf_token值是否丢失。
还有其他人有类似的问题吗?我看错了吗?
我有一个iOS应用程序,需要登录到使用Django的现有站点,并需要CSRF令牌登录.我无法改变这一点.
我当前的尝试是将GET发送到服务器,该服务器将返回CSRF,然后将该cookie作为字符串抓取并将其附加到POST请求.
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://example.com"]];
[req setHTTPShouldHandleCookies:YES];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
self.csrf_cookie = [[(NSHTTPURLResponse *)response allHeaderFields] valueForKey:@"Set-Cookie"];
[self postLoginCredentialsEmail:@"user@example.com" password:@"password"];
}];
- (void)postLoginCredentialsEmail:(NSString *)email password:(NSString *)password {
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://example.com/login"]];
[req addValue:(self.csrf_cookie != nil ? self.csrf_cookie : @"poo") forHTTPHeaderField:@"X-CSRFToken"];
[req setHTTPMethod:@"POST"];
NSString *postData = [NSString stringWithFormat:@"password=%@&;email=%@", password, email];
[req setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-type"];
[req setHTTPBody:[postData dataUsingEncoding:NSUTF8StringEncoding]];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JavaScript的fetch库来向我的Django应用程序提交表单.但无论我做什么,它仍然抱怨CSRF验证.
关于Ajax的文档提到了指定我尝试过的头文件.
我还尝试从templatetag中获取令牌并将其添加到表单数据中.
这两种方法似乎都不起作用.
以下是包含表单值和标题的基本代码:
let data = new FormData();
data.append('file', file);;
data.append('fileName', file.name);
// add form input from hidden input elsewhere on the page
data.append('csrfmiddlewaretoken', $('#csrf-helper input[name="csrfmiddlewaretoken"]').attr('value'));
let headers = new Headers();
// add header from cookie
const csrftoken = Cookies.get('csrftoken');
headers.append('X-CSRFToken', csrftoken);
fetch("/upload/", {
method: 'POST',
body: data,
headers: headers,
})
Run Code Online (Sandbox Code Playgroud)
我能够使用JQuery,但想尝试使用fetch.
django-csrf ×10
django ×9
csrf ×3
iphone ×2
post ×2
axios ×1
cookies ×1
django-1.6 ×1
fetch-api ×1
http-post ×1
https ×1
ios ×1
javascript ×1
python ×1
reactjs ×1