Django 身份验证:CSRF 失败
Django authentication : CSRF Failed
有时我无法登录我的应用程序。
身份验证由 Django API 处理。
但有时它会在结果对象中返回带有此值的 403 错误:
responseText: "{"detail":"CSRF Failed: CSRF token missing or incorrect."}"
然而在我的应用程序中,我有:
angular.module('app')
.config(function(ezLayoutProvider, $httpProvider) {
ezLayoutProvider.register(layoutName, {templateUrl: './main.html'});
ezLayoutProvider.setDefault(layoutName);
var getCookie = function(cookieName) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, cookieName.length + 1) === (cookieName + '=')) {
cookieValue = decodeURIComponent(cookie.substring(cookieName.length + 1));
break;
}
}
}
return cookieValue;
};
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
$httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken');
console.log($httpProvider.defaults.headers.common);
})
控制台显示,在我尝试登录之前,令牌已正确设置。
奇怪的是,一旦我从浏览器中清除了cookie和缓存,它就可以工作了。
所以我猜它以某种方式与 Django 的会话有关?
这是我 settings.py 的一部分:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.DjangoModelPermissions',
),
}
REST_PROXY = {
'HOST': 'http://localhost:5000'
}
CORS_ORIGIN_ALLOW_ALL = True
AUTHENTICATION_BACKENDS = (
'auth.ldap.LDAPBackendFR',
'auth.ldap.LDAPBackendUS',
'auth.ldap.LDAPBackendHK',
'auth.ldap.LDAPBackendIN',
'django.contrib.auth.backends.ModelBackend',
)
另一个奇怪的点是,它似乎也适用于:
Object {Accept: "application/json, text/plain, */*", X-Requested-With: "XMLHttpRequest", X-CSRFToken: null}
如$httpProvider.defaults.headers.common
.
你为什么要用$httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken');
?我不是 AngularJS 专家,但不需要那行。
这是Django文档所说的:
如果您使用的是 AngularJS 1.1.3 及更高版本,则使用 cookie 和标头名称配置
$http
提供程序就足够了:$http.defaults.xsrfCookieName = 'csrftoken'; $http.defaults.xsrfHeaderName = 'X-CSRFToken';
根据我的理解,这就是您的代码应该的样子:
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
/* Not needed, causes harm! */
/* $httpProvider.defaults.headers.common['X-CSRFToken'] = getCookie('csrftoken'); */
console.log($httpProvider.defaults.headers.common);
这也应该解释为什么X-CSRFToken: null
有效。
如果我没记错的话,Django的CSRF有一个他们工作的时间框架。
有时我确实会遇到这个问题并刷新表单,因此 CSRF 确实对我有用。
相关文章:
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- Django: AJAX + CSRF POST gives 403
- JsFiddle在分叉后描述失败
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- 如何照顾CSRF&单页应用程序中不使用cookie的XSS攻击
- Django AJAX:CSRF 验证失败表示缺少 csrf 令牌
- Django 身份验证:CSRF 失败
- 当尝试用ajax上传文件时,CSRF保护总是失败
- detail: "CSRF失败:CSRF令牌丢失或不正确."
- Django ajax视图csrf失败,错误数为500