角度5 Django CSRF令牌

角度5 Django CSRF令牌,django,angular,authentication,django-rest-framework,csrf,Django,Angular,Authentication,Django Rest Framework,Csrf,我试图用Django Rest框架做一个简单的登录页面,但我一直收到一个csrf令牌错误。为了暂时解决这个问题,我在我的登录方法中添加了@csrf_豁免注释,该注释有效但不安全 这是我的方法: @csrf_exempt def login(request): print(request.COOKIES) username = request.POST.get('username') password = request.POST.get('password') p

我试图用Django Rest框架做一个简单的登录页面,但我一直收到一个csrf令牌错误。为了暂时解决这个问题,我在我的登录方法中添加了@csrf_豁免注释,该注释有效但不安全

这是我的方法:

@csrf_exempt
def login(request):
    print(request.COOKIES)
    username = request.POST.get('username')
    password = request.POST.get('password')
    print("username {} password {}".format(username, password))
    user = authenticate(request, username=username, password=password)
    group = None

    if user is not None:
        django_login(request, user)
        request.session.set_expiry(0)
        result = True
        status = 200
    else:
        result = False
        status = 401

    data = {'result': result, 'username': username}

    return HttpResponse(json.dumps(data), content_type="application/json", status=status)
我的Rest框架设置:

REST_FRAMEWORK = {
    'DATETIME_FORMAT': "%m/%d/%Y %H:%M:%S",
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
     ),
     'DEFAULT_FILTER_BACKENDS': (
         'rest_framework.filters.SearchFilter',
         'django_filters.rest_framework.DjangoFilterBackend',
    ),
    'EXCEPTION_HANDLER':  'common.custom_exception_handler.custom_exception_handler'
 }
如果没有
csrf\u豁免
注释,我会得到
禁止(CSRF令牌丢失或不正确)。:/authentication/login

然而,当我打印cookies时,我实际上在cookie中得到了一个令牌

{'csrftoken':'HZc8vPqoad…7eIvTzep','sessionid':'n71c…g5c7'}
在我重新添加@csrf\u豁免注释时打印

在我的angular代码中,我还尝试将csrf令牌附加为带有“X-CSRFToken”的请求头,但我注意到两件事

1) 在我的请求中,我从
document.cookies
获得的X-CSRFToken与上面的token不同。有两种不同的CSRF令牌-为什么

如果您注意到,X-CSRFToken头和cookie中的令牌是不同的。我收到相同的
CSRF令牌丢失或不正确。

2) 即使我删除了JWT身份验证的使用,它也没有任何效果

我还尝试在我的app.module中使用新的XSRF策略替换新的Cookie策略,如下所示:
{
提供:XSRFStrategy,
useValue:new CookieXSRFStrategy('csrftoken','X-csrftoken')
}

但是没有用-我得到了第(1)点中描述的相同问题

但是,当我重新添加
@csrf\u export
注释并检查请求中的cookie时,图像中的cookie将显示


因此,我的主要问题是:为什么即使csrf cookie是请求的一部分,DRF也无法读取令牌?

csrf令牌在登录时会发生变化,可能是您在标头中添加了旧的csrf令牌并要求登录,并且在成功登录时,django在Cookie中向您发送了新令牌,但它甚至从未在第一个位置登录:/它在第一次尝试立即登录时抛出CSRF错误。然而,我觉得这仍然不是问题所在,因为当我检查cookie时,csrf令牌被作为cookie发送,即使我没有明确地将其添加为标头;这里有一个快速入门;通读一遍,我们可以讨论更多您如何在标题中设置csrftoken?您从哪里获得价值?