Django测试客户端未提供正确的身份验证标头

时间:2019-02-13 16:19:20

标签: django authentication

向开发服务器发送请求时,我可以包含一个标头,如下所示:

{
"payload": {
    "google": {
        "expectUserResponse": true,
        "richResponse": {
            "items": [
                {
                    "simpleResponse": {
                        "textToSpeech": "328 characters here"
                    }
                },
                {
                    "basicCard": {
                        "title": "39 characters",
                        "subtitle": "16 characters",
                        "formattedText": "82 characters here"
                    }
                }
            ],
            "suggestions": [
                {
                    "title": "13 characters"
                },
                {
                    "title": "14 characters"
                },
                {
                    "title": "6 characters"
                }
            ]
        }
    }
},
"outputContexts": [
    {
        "name": "default",
        "lifespanCount": 99,
        "parameters": {
            "data": "54 characters"
        }
    }
]
}

在Django内部,您看到一个Authorization: Token efc7fa291f4e320ff4a31cf9a11d6de3a366937cd1ec24e0a7ab68dafa38430f\r\n 头,我不确定该头在哪里生成。

但是在使用Django测试客户端进行单元测试时:

HTTP_AUTHORIZATION

Django无法授权该请求。

如果相反,我将执行以下操作:

from django.test import Client

c = Client()
response = c.get('/api/auth/user/', **{'Authorization': 'Token ' + token})

有效。

我想了解发生了什么事。

谁负责执行映射response = c.get('/api/auth/user/', **{'HTTP_AUTHORIZATION': 'Token ' + token}) -> Authorization

与此问题有关:我正在使用HTTP_AUTHORIZATIONDjango 2.1.5djangorestframework = "==3.9.0"

1 个答案:

答案 0 :(得分:0)

这是Django documentation所说的:

  

通过**extra发送的标头应遵循CGI规范。例如,模拟在HTTP请求中从浏览器发送到服务器的另一个“主机”标头应作为HTTP_HOST传递。

这是相关的CGI报价:

  

HTTP _ *:

     

这些变量特定于使用HTTP发出的请求。         这些变量的解释可能取决于         SERVER_PROTOCOL。

     

名称以“ HTTP_”开头的环境变量包含         如果使用的协议是HTTP,则从客户端读取标头数据。         HTTP标头名称转换为大写,具有所有         出现的“-”替换为“ ”,并以“ HTTP ”开头         给出环境变量名称。标头数据可能是         由客户发送,也可以通过以下方式重写         请勿更改其语义。如果多个标头具有相同的         收到字段名称,则必须将它们重写为单个         具有相同语义的标头。同样,标头为         多行收到的信息必须合并为一行。         服务器必须在必要时更改服务器的表示。         适用于CGI的数据(例如字符集)         环境变量。

这是Django所见,因为您的所有请求均由与CGI兼容的应用服务器(实际上是WSGI,例如gunicorn和uwsgi)处理。因此,基本上,测试客户端需要CGI请求,这意味着您必须根据上述规则转换HTTP标头。