django rest_framework中缺少授权头,是否应该归咎于什么?

ste*_*ory 56 apache authorization apache2 mod-proxy django-rest-framework

我设法扩展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',
           ...
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是apache正在删除授权头,并且我已经阅读了一些S/O问题,这些问题表明,如果apache与基本授权不匹配并进行身份验证,则会丢弃该值,但我不知道如何允许Authorization标头"传递"到Django和WSGIRequest.有谁知道如何解决这个问题?

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

Ste*_*ven 66

如果您正在使用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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的更新.这也适用于Tastypie非基于会话的身份验证. (2认同)

ste*_*ory 35

很抱歉在询问后几分钟回答我自己的问题.但事实证明它毕竟是apache2!在浏览网页并查看一些搜索结果后,我在评论中发现了这一点:

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

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


ser*_*er2 14

这取决于你所做的Django/Apache部署.您需要告诉正确的Apache模块以允许传递"Authentication"HTTP标头:

  • 阿帕奇/ mod_wsgi的:

    WSGIPassAuthorization On

  • 阿帕奇/ mod_fcgid:

    FcgidPassHeader Authorization

换句话说:许多Apache模块过滤"Authentication"HTTP标头,因此Django不会收到它.您必须确保您的Django App正在接收请求.

请参阅: django_rest docApache fcgid doc.

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