如何限制来自GraphQL API端点的匿名用户?

Mic*_* A. 1 authentication django django-rest-framework graphql graphene-python

Django有两种方法。

  1. 常规DRF将用户限制在中间件级别。因此,未登录的用户无法访问任何内容。

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

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

Mar*_*ian 5

如果您想将GraphQL API端点限制为Django登录用户,则可以通过使用以下方法扩展GraphQLView来做到这一点: LoginRequiredMixin

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
Run Code Online (Sandbox Code Playgroud)

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

path('api/', PrivateGraphQLView.as_view(schema=schema), name='api')
Run Code Online (Sandbox Code Playgroud)

按照docs的通常方式。

如果您不想保护整个API,则可以为未受保护的查询和变异创建另一个架构和终结点,从而可以将两者明确分隔。例如在urls.py中:

path('public_api/', GraphQLView.as_view(schema=public_schema), name='public_api')
Run Code Online (Sandbox Code Playgroud)

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