Токены CSRF от Angular 4 до Django - PullRequest
0 голосов
/ 28 апреля 2018

Это дополнительный вопрос к вопросу, который я задал вчера: CSRF-токен в Angular 4 CLI от Django

У меня есть бэкэнд-сервер Django и внешнее приложение Angular. Я пытаюсь отправить форму на английском языке на серверную часть Django с POST. Проблема с токенами CSRF.

Это вид Джанго:

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

А это угловой компонент:

send_sample_form() {

  let d = new Date();
  d.setTime(d.getTime() + 1 * 24 * 60 * 60 * 1000);
  let expires:string = "expires=" + d.toUTCString();
  let cpath:string = '/';
  // this.cookieService.set('csrftoken', this.server_token, d, cpath, '127.0.0.1', false);
  this.cookieService.set('csrftoken', this.server_token);
  let my_headers = new HttpHeaders(
    {
      'X-CSRFToken': this.server_token
    }
  );
  this.http.post('http://127.0.0.1:8000/emptyform/',
        {'my_form': this.sample_form.value},
        {headers: this.server_token, withCredentials: true})
        .subscribe(
          (response) => {
            console.log(response);
          }
        );
}

Когда Angular и Django являются отдельными серверами (localhost: 4200 и 127.0.0.1:8000), угловой код не получает токен CSRF. Когда я запускаю его в производственном режиме, и поэтому на сервере 127.0.0.1:8000 есть только сервер Django, теперь компонент Angular может извлечь токен CSRF с помощью:

ngOnInit() {
  this.http.get('http://127.0.0.1:8000/generate_token/', { observe: 'response' })
      .subscribe(
        (response) => {
          this.server_token = this.cookieService.get('csrftoken');
          console.log(this.server_token);
        });
}

Но я перепробовал все возможные версии метода set () Службы Cookie и все еще получаю 403 от Django.

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, мне нужен файл cookie CSRF и заголовок «X-CSRFToken», чтобы получить статус 200, или я получаю 403. Так что промежуточное ПО CSRF сервера Django, кажется, работает, так как оно возвращает 200 когда запрос имеет файл CSRF и заголовок XCSRFToken.

Я пытался подумать, смогу ли я проверить в функции представления Django, есть ли у запроса правильный файл CSRF с внешнего интерфейса Angular. Я использовал csrf_exempt, чтобы пропустить POST, и пытался найти способ извлечь файл CSRF и сделать визуальную проверку, но не смог найти способ сделать это. Есть ли способ извлечь файл CSRF в виде Django и распечатать его? Как?

печать (запрос [ 'csrftoken'])

Весь код на моем GitHub: https://github.com/shivkiyer/djangoangular

1 Ответ

0 голосов
/ 28 апреля 2018

Так просто, как это: print(request.COOKIES['csrftoken'])

...