django rest_framework中缺less授权头文件,是apache责怪?

我已经设法扩展TokenAuthentication并且在使用请求会话存储我的令牌时,我有一个工作模型,但是当我尝试将Authorization作为头部parameter passing时,我注意到我的响应没有METAvariablesHTTP_AUTHORIZATION 。 我还注意到,如果我传递“Authorization2”作为它在请求中可见的头参数:

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

我的第一个猜测是授权头被Apache删除,我已经读了一些S / O的问题,如果它不符合基本的授权和身份validation,将抛出的价值,但我不知道如何允许授权标头“通过”到Django和WSGIRequest。 有谁知道如何解决这个问题?

我也使用mod_auth_cas和mod_proxy,如果这改变了什么..

如果您使用的是Apache和mod_wsgi,那么在官方的Django REST框架网站中我find了这个简单的解决scheme

Apache mod_wsgi的具体configuration

请注意,如果使用mod_wsgi部署到Apache,授权标头默认情况下不会传递到WSGI应用程序,因为假定authentication将由Apache处理,而不是在应用程序级别处理。

如果您正在部署到Apache,并且使用任何基于非会话的身份validation,则需要显式configurationmod_wsgi以将所需的头传递给应用程序。 这可以通过在适当的上下文中指定WSGIPassAuthorization指令并将其设置为“On”来完成。

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

不好意思回答我自己的问题后问了几分钟。 但事实certificate这毕竟是apache2! 在抓取网页并查看一些search结果后,我在一条评论中发现了这一点:

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

添加上面的行到我的conf文件似乎解决了我所有的问题! 希望这有助于用户在路上!

这取决于你做了哪种types的Django / Apache部署。 您需要告诉正确的Apache模块允许通过“身份validation”HTTP标头:

  • 阿帕奇/ mod_wsgi的:

    WSGIPassAuthorization On

  • 阿帕奇/ mod_fcgid:

    FcgidPassHeader Authorization

换句话说:许多Apache模块会过滤“Authentication”HTTP标头,所以Django不会收到它。 你必须确保你的Django应用程序正在接收请求。

请参阅: django_rest文档和Apache fcgid文档 。

注意:修改Apacheconfiguration后,您将需要重新启动Apache守护进程或告诉重新加载您的.cgi文件(即: touch my_site_fcgifile.fcgi )。