apache2-Django rest_framework中缺少授权标头,是否应该责怪apache?

我设法扩展了TokenAuthentication,并在使用请求会话存储令牌时使用了一个工作模型,但是,当我尝试按此处所述将Authorization作为标头参数传递时,我注意到我的响应没有META变量HTTP_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问题,指出如果apache与基本授权和身份验证不匹配,它将抛出该值,但是我不知道如何 允许Authorization标头“传递”给Django和WSGIRequest。 有谁知道如何解决这个问题?

我也使用mod_auth_cas和mod_proxy,如果那改变了。

3个解决方案
66 votes

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

Apache mod_wsgi特定配置

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

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

# this can go in either server config, virtual host, directory or .htaccess 
WSGIPassAuthorization On
Steven answered 2019-11-08T14:24:53Z
35 votes

问了几分钟后,很抱歉回答我自己的问题。 但是事实证明那毕竟是apache2! 爬网并浏览了一些搜索结果后,我在评论中找到了这一点:

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

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

steve-gregory answered 2019-11-08T14:25:28Z
14 votes

这取决于您执行的是哪种Django / Apache部署。 您需要告诉正确的Apache模块以允许传递“身份验证” HTTP标头:

  • Apache / mod_wsgi:

    touch my_site_fcgifile.fcgi

  • Apache / mod_fcgid:

    touch my_site_fcgifile.fcgi

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

看到:django_rest doc和Apache fcgid doc。

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

serfer2 answered 2019-11-08T14:27:01Z
translate from https://stackoverflow.com:/questions/13387516/authorization-header-missing-in-django-rest-framework-is-apache-to-blame