django rest_框架中缺少授权头,是apache造成的吗?

django rest_框架中缺少授权头,是apache造成的吗?,apache,apache2,authorization,mod-proxy,django-rest-framework,Apache,Apache2,Authorization,Mod Proxy,Django Rest Framework,我已经成功地扩展了TokenAuthentication,当使用请求会话存储令牌时,我有一个工作模型,但是当我尝试将Authorization作为头参数传递时,我注意到我的响应返回时没有元变量HTTP\u Authorization。我还注意到,如果我将“Authorization2”作为头参数传递,那么它在请求中是可见的: { '_content_type': '', 'accepted_media_type': 'application/json', '_requ

我已经成功地扩展了
TokenAuthentication
,当使用请求会话存储令牌时,我有一个工作模型,但是当我尝试将
Authorization
作为头参数传递时,我注意到我的响应返回时没有元变量HTTP\u 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',
           ...
{
“_内容_类型”:”,
“接受的媒体类型”:“应用程序/json”,

“_request”:很抱歉在问了几分钟后回答了我自己的问题。但事实证明,这毕竟是apache2!在浏览了网页并查看了一些搜索结果后,我在一条评论中发现了以下内容:

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

将以上几行添加到我的conf文件中似乎解决了我所有的问题!希望这能帮助用户解决问题!

如果您使用的是Apache和mod_wsgi,那么我在Django REST framework官方网站上找到了解决这一问题的简单方法

Apache mod_wsgi特定配置

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

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


这取决于您进行了哪种Django/Apache部署。您需要告诉正确的Apache模块以允许通过“身份验证”HTTP头:

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader授权

换句话说:许多Apache模块过滤“身份验证”HTTP头,因此Django不会接收它。您必须确保您的Django应用程序正在请求中接收它

见: 和

注:
修改Apache配置后,您需要重新启动Apache守护程序或告诉重新加载.cgi文件(即:
touch my_site\u fcgifile.fcgi
)。

问题是HTTP头
HTTP_AUTHORIZATION
中的下划线。大多数Web服务器只会忽略带有下划线的头

Django-dev服务器也展示了相同的特性,省略了带有下划线的标题

这就是
授权2
有效的原因

一个快速解决方法是将标题中的
\ucode>下划线替换为
-
破折号,


例如,将
HTTP\u授权
更改为
HTTP-AUTHORIZATION

有一个公开的文件记录这种apache行为:如果有人能对这方面的Nginx行为有所了解,那也会很有帮助。@Tom Christie,这就是使用Nginx的方式:代理\u no\u缓存$HTTP\u pragma$HTTP\u AUTHORIZATIONation;proxy\u cache\u bypass$http\u pragma$http\u authorization;proxy\u set\u header http\u authorization$http\u authorization;@Salvatoreivine我在挖掘时看到了一些关于这一点的注释。大概这只适用于使用Nginx作为代理的情况。(?)这对我来说很有效。请注意,我必须将重写规则放在我需要启用它的语句中。这是可行的,但显然,当未发送授权标头时,这将创建一个空的授权标头。是否有方法在未发送授权标头时不获取授权标头?感谢您的更新。这适用于基于Tastype非会话的authenti阳离子也是。这并不总是解决方案。如果确实在Apache中使用fcgid部署了Django(请参阅:),则必须通过添加(通常在vhost.cof中)来告诉mod_fcgid通过“身份验证”头:FcgidPassHeader authorization我尝试过这个,但似乎不起作用。我将它添加到我的站点启用的.conf文件中,并重新启动了apache,但没有效果。我一直在获取重定向以进行身份验证。有什么想法吗?谢谢-这个解决方案也不是Django特定的,它对我适用于Apache2+uwsgi+web.py我有一个手机应用程序的例子发送授权头只在某些特定的请求上被分条,我想知道为什么!我如何在iIS中做到这一点?
# this can go in either server config, virtual host, directory or .htaccess 
WSGIPassAuthorization On