如何限制来自 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 网关

如何将这个现有的 json 转换为 GraphQL 端点?

将多个 3rd 方 GraphQL API 包装在单个 GraphQL 端点中

当我使用 Graphene 在 Django GraphQL API 中获取对象时,如何限制 ForeignKey 字段的项目数?

有啥方法可以在 Spring Boot 项目中为 graphql 端点创建 API 文档

单一 API 端点的优缺点