2016-03-08 32 views
6

Tôi đã nhìn thấy rất nhiều về điều này trên SO, nhưng không có gì có thể khắc phục được sự cố của tôi.Django 1.9 Biểu mẫu AJAX Lỗi mã thông báo CSRF 403 - "Cookie CSRF không được đặt"

Vấn đề:

Với CSRF middleware được kích hoạt, Django phản ứng với 403 theo yêu cầu hình thức AJAX, trong đó nêu: "CSRF cookie không thiết lập"

Tiếp theo documentation, một chức năng JS được thực hiện, mà bộ tùy chỉnh "X-CSRFToken" tiêu đề.

Nó hoạt động như mong đợi, được "csrftoken" cookie từ trình duyệt và các bài viết nó cùng với yêu cầu AJAX:

x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2 

Nhưng phản ứng vẫn là 403.

giải pháp thử:

Tôi đã thử mọi thứ tôi có thể tìm thấy trên SO hoặc web, cụ thể:

  • Kiểm tra về middleware được kích hoạt:

    MIDDLEWARE_CLASSES = [ 
        ... 
        'django.middleware.common.CommonMiddleware', 
        'django.middleware.csrf.CsrfViewMiddleware', 
        'django.contrib.auth.middleware.AuthenticationMiddleware', 
        ... 
    ] 
    
  • trình duyệt khác nhau với bật cookie;

  • Trang trí chế độ xem của tôi với @ensure_csrf_cookie;

  • Đặt {% csrf_token %} trong mẫu của tôi;

  • Sử dụng phím tắt render có ngữ cảnh yêu cầu phù hợp;

  • Đặt tùy chỉnh CSRF_COOKIE_NAMECSRF_HEADER_NAME trong số settings.py;

  • Đặt rõ ràng CSRF_COOKIE_SECURE = FalseCSRF_COOKIE_HTTPONLY = False;

  • Cài đặt rõ ràng thiết lập CSRF_TRUSTED_ORIGINS;

  • Thử nghiệm trên máy chủ phát triển và sản xuất;

  • Thậm chí request.META["CSRF_COOKIE_USED"] = True theo quan điểm của tôi, như một người được đề xuất.

Và vẫn không có gì.

Headers:

Nếu tôi sử dụng @csrf_exemptprint(request.META) theo quan điểm của tôi, rõ ràng là tiêu đề tùy chỉnh "X-CSRFToken" hiện diện trong yêu cầu và định dạng theo tài liệu Django, với "HTTP_" tiền tố , thay thế dấu gạch ngang bằng dấu gạch dưới, tất cả chữ hoa: "HTTP_X_CSRFTOKEN".

Thậm chí nhiều hơn, giá trị khớp với cookie được đặt bởi Django.

Cookies:

Lạ một điều là, nếu tôi cố gắng print(request.COOKIES) theo quan điểm của tôi, trên trang và hình thức nạp Tôi có thể thấy "csrftoken" Cookie đó, nhưng từ điển là trống trên AJAX yêu cầu . Nó có thể là vấn đề?

Tuyệt vọng để tìm thấy những gì thực sự sai. Cảm ơn vì đã đọc nó.

+0

bạn có thể chỉ cho xem và javascript thực tế của bạn? – Alasdair

+0

Những gì bạn đang sử dụng để gửi yêu cầu AJAX? jQuery? – Smile0ff

+0

@ Smile0ff: API tìm nạp. – Nevertheless

Trả lời

6

Ok, vấn đề khá đơn giản, sau đó:

API tìm nạp không gửi thông tin đăng nhập theo mặc định. Theo MDN:

Các thông tin chỉ đọc tài sản của giao diện Yêu cầu chỉ ra liệu user agent nên gửi cookie từ các miền khác trong trường hợp yêu cầu cross-xứ. Điều này tương tự với cờ của XHR là withCredentials, nhưng có ba giá trị có sẵn.

Mặc định là omit và không bao giờ gửi cookie. Bạn chỉ cần thêm same-origin để fetch() đối số chức năng của bạn:

fetch(formUrl, { 
    ... 
    credentials: 'same-origin', 
    ... 
}) 

Và bạn sẽ được tốt để đi:)

Các vấn đề liên quan