Django REST api 调用和 allowed_hosts

Posted

技术标签:

【中文标题】Django REST api 调用和 allowed_hosts【英文标题】:Django REST api calls and allowed_hosts 【发布时间】:2018-02-17 23:46:30 【问题描述】:

我正在尝试在 Django 中实现一个 RESTful API,以便任何 ip 都可以查询端点。但是,如果我设置ALLOWED_HOSTS = ['*'],我会担心标题攻击。

我阅读了对Why is Django throwing error "DisallowedHost at /"? 的回答,其中建议应该响应 api 调用,而不是由服务器响应。

我不完全理解它们的意思或如何实施它,正在寻找建议。

最后,我想知道如何进行一个未被 django 阻止的 api 调用,因为它不在 ALLOWED_HOSTS 中?

【问题讨论】:

ALLOWED_HOSTS 是 Django 开发服务器的设置。您不在开发服务器上运行生产 API。请改用正确的 WSGI 设置。 【参考方案1】:

ALLOWED_HOSTSstringsregular expressions 的列表,代表此 Django 站点可以服务的主机/域名。 您需要使用 Token、JWT 或任何其他身份验证方法来阻止您的 API。

【讨论】:

我正在使用 Django 令牌身份验证,但是当我使用 curl apiview 时,它会因为不是允许的主机而被拒绝。这可能是因为命令正在通过 nginx 路由?【参考方案2】:

您遇到的问题与 ALLOWED_HOSTS 无关,而与 CSRF 保护有关。你有两个选择。您可以使用以下任一方式禁用页面上的跨站点请求伪造保护

@method_decorator(csrf_exempt, name=dispatch)

在你的 django 类之上 >= 1.9,或者在之前的 django 版本中装饰 dispatch 方法,比如:

class myView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(myView, self).dispatch(request, *args, **kwargs)

如果您担心谁可以获得访问权限,则需要研究其他身份验证方法,例如基于令牌的身份验证,以便只有传递正确令牌的站点才能获得访问权限。

【讨论】:

当我 curl 服务器时,它通过 nginx 并被路由到 Django。它明确表示需要将其添加到允许的主机中。我只是在课堂上使用 apiview 并且不确定装饰器是否应该解决这个问题。我可以试着回复你。我目前正在使用 Django 身份验证令牌 您是否尝试添加 127.0.0.1 或您用来访问它的主机名。 你可能需要两者,虽然我从未见过。 我不得不添加发出 curl 命令的设备的 IP 地址,这违背了开放 api 的目的。 仍然不是解决方案。【参考方案3】:

ALLOWED_HOSTS 与您的 API 调用没有任何关系。这是你的服务器应该响应的主机名列表,而不是

【讨论】:

您的回答是令人困惑的部分。响应vs to“我的意思,但不是实现或导致一个vs另一个的原因。我的道歉电话是通过Django restframework和auth token设置的。如果我在端点处卷曲服务器,它会给我这个允许的站点错误。

以上是关于Django REST api 调用和 allowed_hosts的主要内容,如果未能解决你的问题,请参考以下文章

nginx的问题。如何使用jwt(Django)对API进行身份验证调用?

Api 密钥和 Django Rest Framework Auth Token

api rest 调用更新 django 模型时出现错误 415

如何仅在 Django Rest Framework 中的另一个 API 方法中调用 API POST 方法

如何缓存 Django Rest Framework API 调用?

Django - 通过 websocket 在事件上重复发送 API 调用结果(REST 框架 + 通道)