64

当我使用请求会话来存储我的令牌时,我已经设法扩展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 将丢弃该值,但我不知道如何允许授权标头“通过”到 Django 和 WSGIRequest。有谁知道如何解决这个问题?

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

4

4 回答 4

79

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

Apache 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
于 2013-09-02T02:36:40.903 回答
39

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

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

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

于 2012-11-14T21:27:24.660 回答
17

这取决于您进行了哪种 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

于 2015-05-18T18:23:41.283 回答
0

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

Django 开发服务器也表现出相同的情况,省略了带有下划线的标题。

这就是工作的原因Authorization2

一个快速的解决方法是用破折号替换_标题中的下划线,-

前任。更改HTTP_AUTHORIZATIONHTTP-AUTHORIZATION

于 2020-06-01T13:12:06.997 回答