7

使用 django-rest-framework。在 nginx 后面的生产环境中运行时出现 HTTP 403 错误。当我调用从 APIView 继承以支持 GET 操作的特定视图时,我得到:

{"detail": "Invalid username/password"}

但是......我只在浏览器中得到这个。当我对同一个 URL 使用 curl 时,我不明白。无论是直接点击 URL,还是在 Chrome 和 Firefox 中通过 AJAX 加载 URL,我都会收到此错误。

如果我首先使用管理员帐户通过 Django Admin 登录,我不会收到错误消息。

另外,我只知道这是我从 nginx 后面运行的。如果我使用 Django 开发服务器或 gunicorn 运行,并直接点击端口,我很好,并且可以愉快地匿名点击 URL。如果我把 nginx 放在前面,转发到同一个 gunicorn/runserver 我得到这个错误。

也许这与我的 nginx proxy_pass 设置有关?

location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

我正在运行 django rest 框架 2.2.6、Django 1.5 和 nginx 1.2.7。

我在休息框架中将限制设置为一个愚蠢的高数字,并查看了默认情况下似乎都是开放的权限(但也设置得如此明确)。

谁能指出我正确的方向?

谢谢!

卢多。

4

4 回答 4

26

就我而言,我在 Apache 中配置了 HTTP 基本身份验证,但在我的 Django 项目中没有。因为请求具有身份验证标头,所以 Django 应用程序认为我想使用它进行身份验证。我使用以下设置禁用了 Django REST 框架中的身份验证:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': []
}
于 2014-03-26T14:02:06.973 回答
4

如果它是基本的 http 身份验证(如 @Sjoerd 的情况)并且您不需要 django 身份验证,您还可以Authorization在 nginx 反向代理配置中删除标头:

location / {
    ...
    proxy_set_header   Authorization    "";
}
于 2015-06-04T21:51:09.300 回答
3

当您向基本身份验证后面的站点发送请求时,客户端(浏览器)会发送“授权”标头(应该如此 - 请参阅:维基百科上的“基本访问身份验证”)。

Ngnix 将其传递给您的应用程序。

Django Rest Framework 还支持:BasicAuthentication,默认开启。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

来源: http: //www.django-rest-framework.org/api-guide/authentication/

所以 django-rest-framework 看到“授权”标头,并认为应该是 django 用户的密码。

如果这样的用户不存在,那么你得到:“HTTP 401 Unauthorized”。见: http: //www.django-rest-framework.org/api-guide/authentication/#basicauthentication

灵魂

选择一个:a) 添加到您的 ngnix 站点配置

location / {
    ...
    proxy_set_header    Authorization    "";
    ...
}

所以 DRF 不会得到 'Authorization' 标头,所以它不会尝试匹配 django 用户。

在此更改之后 - 无法在 django 端使用基本身份验证(空头!

b)从 REST_FRAMEWORK 中删除“rest_framework.authentication.BasicAuthentication”(在您的 django 设置中)。

如果未定义,请添加到您的 django 设置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
    )
}

可能是最好的解决方案。

c) 使用您的 django 用户/密码进行基本身份验证?

真的吗?- 不!

于 2016-07-27T11:07:19.327 回答
0

如果您启用了节流,您将获得 403 FORBIDDEN。基于这个问题:https://github.com/tomchristie/django-rest-framework/issues/667,关闭 request.user/request.auth 的惰性评估可能是最好的做法。

于 2013-04-12T15:36:44.517 回答