47

Sono riuscito ad estendere TokenAuthentication e ho un modello funzionante quando utilizzo la sessione di richiesta per memorizzare i miei token, tuttavia quando tento di passare Authorization come parametro di intestazione as described here, ho notato che le mie risposte tornano senza la variabile META HTTP_AUTHORIZATION . Ho anche notato che se mi passa "Authorization2" come parametro di intestazione che è visibile nella richiesta:L'header di autorizzazione mancante in django rest_framework, è l'apache da incolpare?

{ 
    '_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', 
      ... 

La mia prima risposta è che l'intestazione di autorizzazione viene rimosso da Apache, e ho letto un paio di S/O domande che affermano che apache cancellerà il valore se non corrisponde all'autorizzazione di base e autentica, ma non ho idea di come consentire all'intestazione dell'autorizzazione di passare attraverso Django e WSGIRequest. Qualcuno sa come risolvere questo problema?

Io uso anche mod_auth_cas e mod_proxy, se questo cambia nulla ..

risposta

32

Spiacente di rispondere alla mia domanda minuti dopo aver chiesto esso. Ma risulta che dopo tutto era apache2! Dopo la scansione del ragnatele e guardando attraverso un paio di risultati di ricerca ho trovato questo in un commento:

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

Aggiungendo le righe di cui sopra per il mio file di configurazione sembrava per risolvere tutti i miei problemi! Speriamo che questo aiuti gli utenti lungo la strada!

+0

C'è un ticket aperto per documentare questo comportamento di apache: https://github.com/tomchristie/django-rest-framework/issues/488 Se qualcuno può far luce su es. Anche il comportamento di Nginx a questo riguardo sarebbe utile. –

+0

@ Tom Christie, questo è come lo si fa con nginx: proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_authorization; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@SalvatoreIovene Ho visto alcune note in giro quando stavo scavando. Presumibilmente ciò si applica solo quando si usa Nginx come proxy. (?) –

55

Se si utilizza Apache e mod_wsgi, poi ho trovato la soluzione facile a questo nel sito ufficiale quadro Django REST

Apache configurazione mod_wsgi specifica

Nota che se la distribuzione di Apache utilizzando mod_wsgi, l'intestazione di autorizzazione non viene passata a un'applicazione WSGI per impostazione predefinita, poiché si presume che l'autenticazione verrà gestita da Apache anziché a livello di applicazione.

Se si sta distribuendo su Apache e si utilizza un'autenticazione non basata sulla sessione, è necessario configurare in modo esplicito mod_wsgi per passare le intestazioni richieste all'applicazione. Questo può essere fatto specificando la direttiva WSGIPassAuthorization nel contesto appropriato e impostandola su 'On'.

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

Grazie per l'aggiornamento. Questo vale anche per l'autenticazione basata sulla sessione non basata su Tastypie. – garromark

+0

Questa NON è sempre la soluzione. Se hai implementato Django in Apache con fcgid (vedi: https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hosting), devi dire a mod_fcgid di passare l'intestazione "Autenticazione" di aggiungendo (di solito in vhost.cof): FcgidPassHeader Autorizzazione – serfer2

+0

Grazie - ha funzionato per me in Ubuntu 14.04 – slogan621

11

dipende da quale tipo di distribuzione Django/Apache che hai fatto. È necessario dire al modulo Apache corretto per consentire di passare "Autenticazione" header HTTP:

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

In altri parole: molti moduli Apache filtra l'intestazione HTTP "Authentication", quindi Django non la riceverà. Devi essere sicuro che la tua App Django lo stia ricevendo su richiesta.

Vedere: django_rest doc e Apache fcgid doc.

NOTA: Dopo aver modificato la configurazione di Apache, è necessario riavviare apache daemon o indicare di ricaricare il file .cgi (ad esempio: touch my_site_fcgifile.fcgi).