【问题标题】:How to restrict anonymous users from GraphQL API endpoint?如何限制来自 GraphQL API 端点的匿名用户?
【发布时间】:2018-12-09 12:25:33
【问题描述】:

Django 有两种方法。

  1. 常规 DRF 在中间件级别限制用户。所以没有登录的用户什么都没有。

  2. 相反,GraphQL 使用“按方法”方法。所以中间件传递所有的请求和每个方法。但之后方法调用装饰器。

我想实现第一种方法,但要针对 GraphQL。但在那种情况下,我需要为登录突变打开路径。如何从有效载荷中提取突变名称?

【问题讨论】:

  • 你真的在问如何限制未登录的用户访问 API?
  • 是的。我想做一次。否则,如果我下次忘记将装饰器添加到函数中 - 这将是违规行为。
  • 我发现这个答案也很有帮助:stackoverflow.com/questions/39026831/…

标签: django authentication django-rest-framework graphql graphene-python


【解决方案1】:

如果您想将 GraphQL API 端点限制为 Django 登录用户,您可以通过使用 LoginRequiredMixin 扩展 GraphQLView 来实现

from django.contrib.auth.mixins import LoginRequiredMixin
from graphene_django.views import GraphQLView

class PrivateGraphQLView(LoginRequiredMixin, GraphQLView):
    """Adds a login requirement to graphQL API access via main endpoint."""
    pass

然后将此视图添加到您的urls.py 喜欢

path('api/', PrivateGraphQLView.as_view(schema=schema), name='api')

按照docs的常规方式。

如果您不想保护整个 API,您可以为未受保护的查询和突变创建另一个架构和端点,这样可以清楚地分开每个。例如在 urls.py 中:

path('public_api/', GraphQLView.as_view(schema=public_schema), name='public_api')

请注意,每个 API 端点必须至少有一个查询才能工作,否则会导致断言错误。

【讨论】:

  • 谢谢。但是,如果我需要在没有身份验证的情况下传递一些调用?例如登录突变?
  • 可能有一个不需要身份验证的不同 API 端点 URL。这种方法的一个优点是允许您保持清晰的分离。我会更新我的答案。
【解决方案2】:

不确定它是否符合您的目的,但我使用了以下库,该库使用石墨烯的 JWT 身份验证,类似于 JWT 和 DRF 的工作原理!

https://github.com/flavors/django-graphql-jwt

【讨论】:

  • 有没有办法用登录装饰器包装 所有 路由(身份验证端点除外)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多