django rest_framework中缺少授权头,是apache的错吗?

问题描述 投票:57回答:4

我已经设法扩展了 TokenAuthentication 当使用请求会话来存储我的代币时,我有一个工作模型,但是当我试图通过 Authorization 作为头参数 如上所述我注意到,我的Response返回时没有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删除了,我读了一些SO的问题,说apache会扔掉这个值,如果它不符合基本的授权和认证,但我不知道如何让授权头 "通过 "到Django和WSGIRequest。有人知道如何解决这个问题吗?

我还使用了mod_auth_cas和mod_proxy,如果这能改变什么的话。

apache apache2 authorization mod-proxy django-rest-framework
4个回答
69
投票

如果你使用的是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

35
投票

不好意思,自己的问题问了几分钟才回答。但事实证明,毕竟是apache2的问题! 在抓取了网页和查看了一些搜索结果后,我在一个评论中发现了这个。

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

在我的conf文件中加入以上几行似乎解决了我所有的问题! 希望对以后的用户有所帮助!


14
投票

这要看你做的是哪种DjangoApache部署。你需要告诉正确的Apache模块允许传递 "Authentication "的HTTP头。

  • Apachemod_wsgi:

    WSGIPassAuthorization On

  • Apachemod_fcgid。

    FcgidPassHeader Authorization

换句话说:很多Apache模块会过滤 "Authentication "的HTTP头,所以Django不会收到它。你必须确保你的Django App在请求中接收到它。

请看django_rest docApache fcgid doc.

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


0
投票

问题是HTTP头中的下划线。HTTP_AUTHORIZATION. 大多数的webservers都会忽略带下划线的标题。

Django开发服务器也有同样的表现,省略了带下划线的头信息。

这就是为什么 Authorization2 工作。

一个快速的解决方法是将 _ 标题中的下划线与 - 破折号。

例:改变 HTTP_AUTHORIZATIONHTTP-AUTHORIZATION

© www.soinside.com 2019 - 2024. All rights reserved.