如何限制来自 GraphQL API 端点的匿名用户?
Posted
技术标签:
【中文标题】如何限制来自 GraphQL API 端点的匿名用户?【英文标题】:How to restrict anonymous users from GraphQL API endpoint? 【发布时间】:2018-12-09 12:25:33 【问题描述】:Django 有两种方法。
常规 DRF 在中间件级别限制用户。所以没有登录的用户什么都没有。
相反,GraphQL 使用“按方法”方法。所以中间件传递所有的请求和每个方法。但之后方法调用装饰器。
我想实现第一种方法,但要针对 GraphQL。但在那种情况下,我需要为登录突变打开路径。如何从有效载荷中提取突变名称?
【问题讨论】:
你真的在问如何限制未登录的用户访问 API? 是的。我想做一次。否则,如果我下次忘记将装饰器添加到函数中 - 这将是违规行为。 我发现这个答案也很有帮助:***.com/questions/39026831/… 【参考方案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
【讨论】:
有没有办法用登录装饰器包装 所有 路由(身份验证端点除外)?以上是关于如何限制来自 GraphQL API 端点的匿名用户?的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 和 Zuul:Graphql 将作为一个休息端点工作,zuul 作为 api 网关
将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中
当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?