从Angular 4到Django的CSRF令牌

时间:2018-04-28 20:13:06

标签: django angular cookies csrf

这是我昨天问的一个问题的后续问题: CSRF token in Angular 4 CLI from Django

我有一个后端Django服务器和一个前端Angular应用程序。我试图通过POST将Angular中的表单提交给Django后端。问题出在CSRF令牌上。

这是Django视图:

var PageVars Variables
    PageVars = Variables{
        UserNames: ulist,
        Checks: check,
    }
    log.Println("ulist",ulist)
    err = tpl.Execute(w, PageVars) //execute the template and pass it to index page
    if err != nil { // if there is an error
        log.Print("template executing error: ", err) //log it on terminal
    }

这是Angular组件:

{{range .UserNames .Checks}}
{{.UserNames}}: <input type="checkbox" name="email" value={{. UserNames}} {{.Checks}}/><br />
{{end}}

当Angular和Django是独立的服务器(localhost:4200和127.0.0.1:8000)时,角度代码不会获得CSRF令牌。当我在生产模式下运行它,因此在127.0.0.1:8000只有Django服务器时,现在Angular组件能够提取CSRF令牌:

#@csrf_exempt
def empty_form(request):
    if request.method=="POST":
        message = "Post"
    else:
        message = "Get"
    return JsonResponse({'message': message})

但是我已经尝试了Cookie服务的set()方法的每个可能版本,并且仍然从Django获得403.

this.cookieService.set('csrftoken',this.server_token,d,cpath,'127.0.0.1',false); 要么 this.cookieService.set('csrftoken',this.server_token);

为了检查Django服务器,我使用Postman向我的Django服务器发送请求。获取请求为我提供了CSRF令牌。当我发出POST请求时,我需要一个CSRF cookie和一个标题'X-CSRFToken'来获取状态200或者我得到403.所以Django服务器CSRF中间件似乎正在工作,因为它确实给了200当请求具有CSRF cookie和XCSRFToken标头时。

如果请求具有来自Angular前端的正确CSRF cookie,我试图考虑是否可以检入Django视图函数。我使用'csrf_exempt'让POST通过,并试图找到一种方法来提取CSRF cookie并进行目视检查但无法找到方法。有没有办法在Django视图中提取CSRF cookie并将其打印出来?样的?

打印(请求[ 'csrftoken'])

整个代码都在我的GitHub上: https://github.com/shivkiyer/djangoangular

1 个答案:

答案 0 :(得分:1)

这很简单:print(request.COOKIES['csrftoken'])