gpt4 book ai didi

javascript - Django 身份验证 : CSRF Failed

转载 作者:行者123 更新时间:2023-11-30 16:18:23 25 4
gpt4 key购买 nike

有时我无法登录我的应用程序。

身份验证由 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);
})

在我尝试登录之前,控制台显示 token 已正确设置。

奇怪的是,一旦我从浏览器中清除我的 cookie 和缓存,它就可以工作了。

所以我猜它与 Django 的 session 有某种关系?

这是我的 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 documentation说:

If you’re using AngularJS 1.1.3 and newer, it’s sufficient to configure the $http provider with the cookie and header names:

$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 是有效的。

关于javascript - Django 身份验证 : CSRF Failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35127072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com