47

TokenAuthentication'u genişletmeyi başardım ve belirteçlerimi saklamak için istek oturumunu kullanırken bir çalışma modelim var, ancak Authorization'u as described here bir üstbilgi parametresi olarak geçmeye çalıştığımda, Yanıtlarımın META değişkeni HTTP_AUTHORIZATION olmadan geri geldiğini fark ettim . Ben de bir başlık parametre olarak "Authorization2" geçirirseniz o istekte görünür olduğunu fark:Yetkilendirme üstbilgisi django rest_framework'da eksik, apache suçlanıyor mu?

{ 
    '_content_type': '', 
    'accepted_media_type': 'application/json', 
    '_request': <WSGIRequest 
     path:/api/test_auth/, 
     GET:<QueryDict: {}>, 
     POST:<QueryDict: {}>, 
     COOKIES:{ 
      'MOD_AUTH_CAS_S': 'ba90237b5b6a15017f8ca1d5ef0b95c1', 
      'csrftoken': 'VswgfoOGHQmbWpCXksGUycj94XlwBwMh', 
      'sessionid': 'de1f3a8eee48730dd34f6b4d41caa210' 
     }, 
     META:{ 
      'DOCUMENT_ROOT': '/etc/apache2/htdocs', 
      'GATEWAY_INTERFACE': 'CGI/1.1', 
      'HTTPS': '1', 
      'HTTP_ACCEPT': '*/*', 
      'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
      'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch', 
      'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 
      'HTTP_AUTHORIZATION2': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4c', 
      ... 

Benim ilk tahminim yetkilendirme başlık apache tarafından kaldırıldığı durumda olduğunu, ve birkaç S okudum/O, temel yetkilendirme ve kimlik doğrulamasıyla eşleşmezse, apache'nin değeri atacağını belirten sorulara yanıt verir, ancak Yetkilendirme başlığının Django ve WSGIRequest'e 'geçiş yapmasına' nasıl izin verileceği konusunda hiçbir fikrim yoktur. Bu sorunu nasıl çözecek bilen var mı? bu bir şey değişirse

Ben de .. o soran sonra kendi soru dakika cevaplamak için üzgünüm

cevap

32

, mod_auth_cas ve mod_proxy kullanabilirsiniz. Ama sonuçta apache2 çıktı! ağlarını tarama ve birkaç arama sonuçları aracılığıyla baktıktan sonra ben bir yorum buldum:

RewriteEngine on 
RewriteCond %{HTTP:Authorization} ^(.*) 
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] 

benim conf dosyasına yukarıdaki satırları ekleme benim sorunlarınızı çözmek gibiydi! Umarım bu, kullanıcıların yolda olmasına yardımcı olur!

+0

Bu apache davranışını belgelemek için bir açık bilet vardır: https://github.com/tomchristie/django-rest-framework/issues/488 Örneğin, örneğin, bir miktar ışık tutabilir. Bu konuda Nginx davranışı da yararlı olabilir. –

+0

@Tom Christie, nginx ile bunu nasıl yapıyorsunuz: proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_authorization; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@SalvatoreIovene Kazı yaparken etrafta birkaç not gördüm. Muhtemelen sadece Nginx'i bir proxy olarak kullanırken geçerlidir. (?) –

55

Apache ve mod_wsgi kullanıyorsanız, o zaman Apache dağıtma eğer kullanarak bu

Apache mod_wsgi özel yapılandırma

Not resmi Django DİNLENME çerçeve sitesinde bu kolay çözüm buldu mod_wsgi, yetkilendirme üstbilgisi varsayılan olarak bir WSGI uygulamasına geçirilmez, çünkü bir uygulama düzeyinde değil, kimlik doğrulamanın Apache tarafından ele alınacağı varsayılır.

Apache'ye dağıtıyorsanız ve oturum tabanlı olmayan bir kimlik doğrulaması kullanıyorsanız, mod_wsgi'yi gerekli üstbilgileri uygulamaya geçirmek için açıkça yapılandırmanız gerekir. Bu, WSGIPassAuthorization yönergesini uygun bağlamda belirterek ve 'Açık' olarak ayarlayarak yapılabilir.

# this can go in either server config, virtual host, directory or .htaccess 
WSGIPassAuthorization On 
+2

Güncelleme için teşekkürler. Bu, Tastypie oturum dışı tabanlı kimlik doğrulaması için de geçerlidir. – garromark

+0

Bu her zaman çözüm değildir. Apache'de Django'yu fcgid ile konuşlandırdıysanız (bkz: https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hosting), mod_fcgid'in "Authentication" başlığını geçmesi gerektiğini bildirmeniz gerekir. ekleyerek (genellikle vhost.cof): FcgidPassHeader Yetkilendirme – serfer2

+0

Teşekkürler - Ubuntu 14.04 – slogan621

11

Yaptığın Django/Apache dağıtım üzerinde tür bağlıdır. Sen geçmesine izin vermek için doğru Apache modülünü anlatmak gerekiyor "Doğrulama" HTTP başlığı:

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

Diğer tarafta kelimeler: Birçok Apache modülü "Kimlik Doğrulama" HTTP üstbilgisini filtreler, bu yüzden Django bunu almayacaktır. Django Uygulamanızın istekte olduğundan emin olmalısınız.

Bkz: django_rest doc ve Apache fcgid doc.

NOT: Apache yapılandırmasını değiştirdikten sonra, apache arka planını yeniden başlatmanız veya .cgi dosyanızı yeniden yüklemeniz gerektiğini bildirmeniz gerekir (i.e: touch my_site_fcgifile.fcgi).