2013-04-12 25 views
6

Sử dụng django-rest-framework. Tôi nhận được lỗi HTTP 403 khi chạy trong sản xuất sau nginx. Khi tôi gọi một chế độ xem cụ thể, được kế thừa từ APIView để hỗ trợ hoạt động GET, tôi nhận được:khung công tác còn lại django cung cấp cho 403 khi phía sau nginx nhưng không trực tiếp

{"detail": "Invalid username/password"} 

Nhưng ... Tôi chỉ nhận được điều này trong trình duyệt. Tôi không hiểu khi tôi sử dụng curl cho cùng một URL. Tôi nhận được lỗi này cho dù tôi đã truy cập URL trực tiếp hay tải URL thông qua AJAX, trong cả Chrome và Firefox.

Tôi không gặp lỗi nếu tôi đăng nhập qua Quản trị viên Django bằng tài khoản quản trị trước.

Ngoài ra, tôi chỉ nhận được điều này là tôi đang chạy từ phía sau nginx. Nếu tôi chạy với máy chủ devango Django, hoặc gunicorn, và nhấn trực tiếp vào cổng, tôi ổn, và có thể vui vẻ nhấn URL nặc danh. Nếu tôi sau đó đặt nginx ở phía trước này, để chuyển tiếp đến cùng một gunicorn/runerver tôi nhận được lỗi này.

Có thể nó liên quan đến cài đặt nginx proxy_pass của tôi?

location/{ 
    proxy_pass http://127.0.0.1:8000; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

Tôi đang chạy khung còn lại django 2.2.6, Django 1.5 và nginx 1.2.7.

Tôi đặt điều chỉnh thành số cao ngớ ngẩn trong khung còn lại và xem các quyền mà tất cả dường như mở theo mặc định (nhưng cũng được đặt rõ ràng).

Có ai có thể chỉ cho tôi đúng hướng không?

Cảm ơn!

Ludo.

+0

cài đặt xác thực của bạn cho django-rest-framework là gì? – iMom0

+0

Tôi chỉ sử dụng các giá trị mặc định, có vẻ phù hợp. – Ludo

Trả lời

0

Bạn sẽ nhận được 403 FORBIDDEN nếu bạn đã bật điều chỉnh. Dựa trên vấn đề này: https://github.com/tomchristie/django-rest-framework/issues/667, tắt đánh giá lười biếng của request.user/request.auth có lẽ là điều tốt nhất để làm.

+1

Cập nhật phiên bản mới nhất của khung công tác REST nên giải quyết vấn đề này. (Vé tham chiếu hiện đã đóng) –

+0

Xin chào. Cảm ơn! Tôi đang trên 2,2,6 mặc dù, có vẻ như nó bao gồm sửa chữa này. Tôi đang cố gắng để làm theo các chủ đề nhưng không thể thấy một cách dễ dàng để vô hiệu hóa throttling. Tôi đã đặt một giá trị ga cao. Có lẽ tôi nên thử một lớp auth tùy chỉnh? Tôi sẽ thử điều tiếp theo mà tôi nghĩ trừ phi tôi nghe được. Cảm ơn – Ludo

+0

Tôi đã tắt điều chỉnh và xác thực và mọi thứ bắt đầu hoạt động. Cảm ơn. – Ludo

23

Trong trường hợp của tôi, tôi đã xác thực cơ sở HTTP được định cấu hình trong Apache, nhưng không có trong dự án Django của tôi. Bởi vì yêu cầu có tiêu đề xác thực, ứng dụng Django nghĩ rằng tôi muốn xác thực với nó. Tôi vô hiệu hóa xác thực trong khuôn khổ Django REST của sử dụng các thiết lập này:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': [] 
} 
+1

Cảm ơn bạn! đây là vấn đề của tôi chính xác – jarv

+0

Bạn không cần phải vô hiệu hóa tất cả các lớp auth, chỉ loại bỏ auth cơ bản. Xem câu trả lời khác tại đây http://stackoverflow.com/questions/19693433/django-rest-framework-behind-http-basic-authentication – chhantyal

+0

Tuyệt vời. Đây là vấn đề của tôi khi sử dụng VPS + Apache + Passenger (Dreamhost). – oooyaya

3

Nếu đó là một auth http cơ bản (như trong trường hợp @ Sjoerd) và bạn không cần phải có chứng thực django, bạn cũng có thể loại bỏ Authorization tiêu đề trong bạn nginx ngược Proxy cấu hình:

location/{ 
    ... 
    proxy_set_header Authorization ""; 
} 
+1

Cảm ơn vì điều này! Chúng tôi vừa mới gặp phải vấn đề tương tự, điều này đã giúp! –

+0

Đây phải là câu trả lời được chấp nhận. – Lev

2

Khi bạn gửi một yêu cầu đến trang web, đó là đằng sau xác thực cơ bản, client (trình duyệt) gửi 'Authorization' tiêu đề (như nó phải - xem: "xác thực truy cập cơ bản" trên wikipedia).

Ngnix chuyển nó tới ứng dụng của bạn.

Django Rest Framework cũng hỗ trợ: BasicAuthentication và được bật theo mặc định.

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

nguồn: http://www.django-rest-framework.org/api-guide/authentication/

Vì vậy django-nghỉ ngơi-framework thấy tiêu đề 'Phép', và nghĩ rằng đó là nên sử dụng django bằng mật khẩu.

Nếu người dùng đó không tồn tại, bạn sẽ nhận được: "HTTP 401 trái phép". Xem: http://www.django-rest-framework.org/api-guide/authentication/#basicauthentication

Soultions

Chọn một: a) Thêm vào ngnix trang web cấu hình của bạn

location/{ 
    ... 
    proxy_set_header Authorization ""; 
    ... 
} 

nên DRF sẽ không nhận được tiêu đề 'Phép', vì vậy nó sẽ không cố gắng để phù hợp với người dùng django.

Sau thay đổi này - auth cơ bản không thể được sử dụng trên mặt django (trống tiêu đề

b) Loại bỏ "rest_framework.authentication.BasicAuthentication" từ REST_FRAMEWORK (trong cài đặt django của bạn).

Nếu không xác định, thêm vào các thiết lập của bạn django:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

giải pháp Probbably tốt nhất.

c) Sử dụng người dùng/mật khẩu django của bạn cho auth cơ bản?

Thực sự? - Đừng!

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