2012-11-14 104 views
47

我已經設法擴展TokenAuthentication,並且在使用請求會話存儲我的令牌時我有一個工作模型,但是當我嘗試將Authorization作爲頭參數as described here時,我注意到我的響應沒有META變量返回HTTP_AUTHORIZATION 。我也注意到,如果我通過「許可2」作爲頭參數,這是在請求可見:django rest_framework中缺少授權標頭,是apache責備?

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

我的第一個猜測是,授權頭被阿帕奇除去,我已經看了幾個小號/ O問題,如果它不符合基本授權和驗證,apache將拋出該值,但我不知道如何允許授權標頭'通過'到Django和WSGIRequest。有誰知道如何解決這個問題?

我也用mod_auth_cas和mod_proxy的,如果改變任何東西..

回答

32

對不起要求它後,回答我的問題分鐘。但事實證明它畢竟是apache2!爬行網,並通過幾個搜索結果看後,我發現這評論:

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

添加上述行我的conf文件似乎解決所有我的問題!希望這有助於用戶在路上!

+0

有一個打開的票證來記錄這個apache行爲:https://github.com/tomchristie/django-rest-framework/issues/488如果有人可以說明一些例如。 Nginx在這方面的行爲也會有所幫助。 –

+0

@Tom Christie,這是你如何使用nginx:proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_authorization; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@SalvatoreIovene我在挖掘時看到了一些筆記。推測這隻適用於使用Nginx作爲代理。 (?) –

55

如果您正在使用Apache和mod_wsgi的,後來我發現在官方Django的REST框架的網站上輕鬆地解決了這個

阿帕奇mod_wsgi的具體配置

注意,如果部署到Apache使用mod_wsgi,默認情況下,授權頭沒有傳遞給WSGI應用程序,因爲假定驗證將由Apache處理,而不是在應用程序級別處理。

如果您要部署到Apache並使用任何基於非會話的身份驗證,則需要顯式配置mod_wsgi以將所需的頭傳遞給應用程序。這可以通過在適當的上下文中指定WSGIPassAuthorization指令並將其設置爲「On」來完成。

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

感謝您的更新。這也適用於基於非會話的Tastypie身份驗證。 – garromark

+0

這並不總是解決方案。如果使用fcgid在Apache中部署Django(請參閱:https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hosting),則必須告訴mod_fcgid通過「Authentication」標頭添加(通常在vhost.cof中):FcgidPassHeader授權 – serfer2

+0

謝謝 - 在Ubuntu爲我工作14.04 – slogan621

11

這取決於哪一種你做的Django/Apache的部署。你需要告訴正確的Apache模塊允許通過 「驗證」 HTTP標頭:

  • 阿帕奇/ mod_wsgi的:

    WSGIPassAuthorization On

  • 的Apache/mod_fcgid:

    FcgidPassHeader Authorization

其他單詞:許多Apache模塊過濾「身份驗證」HTTP標頭,因此Django不會收到它。你必須確定你的Django應用程序正在收到請求。

參見: django_rest docApache fcgid doc

注: 修改Apache的配置後,您需要重新啓動Apache後臺程序或者告訴重新加載的CGI文件(即:touch my_site_fcgifile.fcgi)。