授权头在Django rest_framework失踪,就是Apache惹的祸?(Authoriza

2019-06-21 03:45发布

我已经成功地延长TokenAuthentication ,我使用请求会话时来存储我的令牌,但是当我试图传递有一个工作模型Authorization的头参数为这里所描述的,我发现我的答复回来没有META变量HTTP_AUTHORIZATION 。 我也注意到,如果我通过“许可2”作为头参数,这是在请求中可见:

{
    '_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的问题,但我不知道如何允许授权报头为“通过”,以Django和所述WSGIRequest。 有谁知道如何解决这个问题?

我也用mod_auth_cas和mod_proxy的,如果改变任何东西..

Answer 1:

如果您正在使用Apache和mod_wsgi的,后来我发现在官方Django的REST框架的网站上轻松地解决了这个

阿帕奇mod_wsgi的具体配置

请注意,如果使用mod_wsgi的部署到Apache,授权头不是通过默认传递到WSGI的应用程序,因为它假定该认证将被Apache,而不是在应用层进行处理。

如果要部署到Apache,并使用任何非基于会话的认证,则需要明确配置的mod_wsgi通过给应用程序传递所需的标题。 这可以通过在适当的范围内指定WSGIPassAuthorization指令并将其设置为“开”来完成。

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


Answer 2:

对不起要求它后,回答我的问题分钟。 但事实证明,这毕竟是Apache2的! 爬行网,并通过几个搜索结果看后,我发现这评论:

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

将上述行我的conf文件似乎解决所有我的问题! 希望这有助于用户在路上!



Answer 3:

这取决于哪一种你做的Django / Apache的部署。 你需要告诉正确的Apache模块允许通过“验证” HTTP标头:

  • 阿帕奇/ mod_wsgi的:

    WSGIPassAuthorization On

  • 阿帕奇/ mod_fcgid:

    FcgidPassHeader Authorization

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

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

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



文章来源: Authorization header missing in django rest_framework, is apache to blame?