2013-04-12 13 views
6

django-rest-framework kullanımı. Nginx'in arkasında üretim yaparken HTTP 403 hataları alıyorum. Ben bir GET operasyonu desteklemek için APIView devraldığı belirli bir görünüm, aradığınızda, alıyorum:django rest framework, nginx'in arkasındayken 403 verir, ancak doğrudan değil

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

Ama ... Ben sadece bir tarayıcıda bu olsun. Aynı URL için curl kullandığımda anlayamıyorum. URL'ye doğrudan girip girmediğimi veya URL'yi AJAX aracılığıyla hem Chrome hem de Firefox'ta yüklediğimde bu hatayı alıyorum.

Önce bir yönetici hesabıyla Django Yöneticisi aracılığıyla giriş yaparsam hatayı alamıyorum.

Ayrıca, bunu sadece nginx'in arkasından koşuyorum. Ya Django dev sunucusuyla ya da silahla koşarsam ve doğrudan limana isabet edersem, iyiyim ve anonim olarak URL'ye mutlu bir şekilde vurabilirim. Eğer bundan sonra nginx'i koyduysam, aynı topçuya/koşucuya iletmek için bu hatayı alıyorum.

Belki nginx proxy_pass ayarlarım ile ilgili bir şey var mı?

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; 
} 

django rest framework 2.2.6, Django 1.5 ve nginx 1.2.7 çalıştırıyorum.

Dinlenme çerçevesindeki aptalca bir sayıya daraltmayı ayarlıyorum ve tümü varsayılan olarak açık görünen izinlere (ancak açıkça belirtildiği gibi) baktım.

Beni doğru yöne yönlendiren var mı?

Teşekkürler! Ludo.

+0

django-rest-framework için kimlik doğrulama ayarlarınız nedir? – iMom0

+0

Sadece uygun görünen varsayılanları kullanıyorum. – Ludo

cevap

0

Kısalmayı etkinleştirdiyseniz 403 FORBIDDEN alırsınız. Bu konuya dayanarak: https://github.com/tomchristie/django-rest-framework/issues/667, request.user/request.auth'un tembel değerlendirmesini devre dışı bırakmak muhtemelen yapılacak en iyi şeydir.

+1

REST çerçevesinin en son sürümüne güncellemek bu sorunu çözmelidir. (Belirtilen bilet şu anda kapalı) –

+0

Merhaba. Teşekkürler! Bu düzeltmeyi içerdiği gibi 2.2.6 olsa da yaşıyorum. İpliği takip etmeye çalışıyorum ama azaltmayı devre dışı bırakmak için kolay bir yol göremiyorum. Çok yüksek bir gaz kelebeği değeri ayarlamıştım. Belki özel bir kimlik sınıfını denemeliyim? Başka türlü duymadıkça düşüneceğim bir sonraki adımı deneyeceğim. Teşekkür – Ludo

+0

Kısıtlamayı ve yetkiyi kapattım ve her şey çalışmaya başladı. Teşekkürler. – Ludo

23

Benim durumumda, Apache'de yapılandırılmış HTTP temel kimlik doğrulaması vardı, ancak Django projemde değil. İstek kimlik doğrulaması üstbilgileri olduğundan, Django uygulaması onunla kimlik doğrulamak istediğimi düşündü. Bu ayarları kullanarak Django DİNLENME çerçevesinde özürlü kimlik doğrulaması:

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

Teşekkür ederiz! Bu benim sorunum tam olarak – jarv

+0

Tüm auth sınıflarını devre dışı bırakmanız gerekmez, yalnızca temel kimlik bilgisini kaldırın. Başka bir cevap burada bakın http://stackoverflow.com/questions/19693433/django-rest-framework-behind-http-basic-authentication – chhantyal

+0

Mükemmel. Bu benim VPS + Apache + Yolcu (Dreamhost) kullanarak benim sorun oldu. – oooyaya

3

Eğer bir Django kimlik doğrulama gerekmez ve (@ sjoerd vakasında olduğu gibi) temel bir http kimlik doğrulama var, ayrıca içinde Authorization başlığını kaldırmak edebilirsiniz nginx ters vekil yapılandırma:

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

Bunun için teşekkürler! Sadece aynı konuya girdik, bu yardımcı oldu! –

+0

Bu kabul edilen cevap olmalı. – Lev

2

bunu gerektiği gibi (temel kimlik doğrulaması, istemci (tarayıcı) gönderir 'Authorization' başlığında arkasında sitesine, bir istek göndermek - bkz: "temel erişim kimlik doğrulaması" konulu Ara).

Ngnix, uygulamanıza aktarır.

Django Rest Framework ayrıca şunları da destekler: Temel Kimlik Doğrulama ve varsayılan olarak etkindir.

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

kaynak: http://www.django-rest-framework.org/api-guide/authentication/

Yani django-dinlenme-çerçeve 'Authorization' başlığını görür ve bu şifre ile Django kullanıcı olmalıdır olduğunu düşünür.

Böyle bir kullanıcı yoksa, "HTTP 401 Yetkisiz" 'i aldınız. Bkz: http://www.django-rest-framework.org/api-guide/authentication/#basicauthentication

soultions

biri seçin: a) ngnix sitesi yapılandırma ekle

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

yüzden DRF 'Authorization' başlığı almazsınız, bu yüzden denemek olmayacak django kullanıcısı eşleştirmek için. Bu değişiklikten sonra

- temel yetkilendirme (sizin django ayarlarında) REST_FRAMEWORK dan "rest_framework.authentication.BasicAuthentication" kurtulun Django tarafında (! boş başlık

b) üzerinde kullanılamaz.

tanımlı değilse

, sizin django ayarlarına ekleyin:

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

probbably iyi çözüm.

c) Temel kullanıcı için django kullanıcı/parolanızı kullanın?

Gerçekten mi? - Yapma!

İlgili konular