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_HOSTS
是 strings
或 regular 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 方法