You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Django项目的GraphQL API添加身份验证以隐藏接口

解决方案

针对你的问题,以下是几种可行的方法来限制/graphql/接口的访问,结合django-graphql-auth实现账号密码验证:

方法1:用Django认证装饰器保护GraphQL视图

直接限制访问/graphql/路径的用户必须先通过Django账号密码登录,匿名用户会被重定向到登录页面(API请求会返回403)。

修改项目的urls.py:

from django.contrib.auth.decorators import login_required
from graphene_django.views import GraphQLView
from .schema import schema

urlpatterns = [
    # 其他路由
    path("graphql/", login_required(GraphQLView.as_view(graphiql=True, schema=schema))),
]

方法2:在GraphQL Schema层面添加全局权限校验

允许用户访问/graphql/接口(比如查看GraphiQL界面),但执行任何查询或突变前必须通过JWT认证(依赖django-graphql-auth自带的graphql-jwt)。

步骤1:配置GraphQL中间件

在settings.py中添加JWT中间件:

GRAPHENE = {
    'SCHEMA': 'your_project.schema.schema',
    'MIDDLEWARE': [
        'graphql_jwt.middleware.JSONWebTokenMiddleware',
    ],
}

AUTHENTICATION_BACKENDS = [
    'graphql_auth.backends.GraphQLAuthBackend',
    'django.contrib.auth.backends.ModelBackend',
]

步骤2:为查询/突变添加登录校验

在schema.py中,用login_required装饰器包裹所有查询和突变的解析函数:

import graphene
from graphql_jwt.decorators import login_required
from graphene_django import DjangoObjectType
from django.contrib.auth.models import User

class UserType(DjangoObjectType):
    class Meta:
        model = User
        fields = ("id", "username", "email")

class Query(graphene.ObjectType):
    me = graphene.Field(UserType)
    
    @login_required
    def resolve_me(self, info, **kwargs):
        return info.context.user

# 示例突变
class CreatePost(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
    
    success = graphene.Boolean()

    @login_required
    def mutate(self, info, title):
        # 执行创建逻辑
        return CreatePost(success=True)

class Mutation(graphene.ObjectType):
    create_post = CreatePost.Field()

schema = graphene.Schema(query=Query, mutation=Mutation)

方法3:自定义中间件拦截未认证请求

编写一个Django中间件,直接拦截所有未认证用户对/graphql/的请求:

步骤1:创建中间件文件middleware.py

from django.http import HttpResponseForbidden

class GraphQLAuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 仅拦截/graphql/路径的未认证请求
        if request.path == '/graphql/' and not request.user.is_authenticated:
            return HttpResponseForbidden("Access Denied: Authentication required.")
        return self.get_response(request)

步骤2:在settings.py中注册中间件

MIDDLEWARE = [
    # 其他中间件(注意顺序:放在认证中间件之后)
    'your_app.middleware.GraphQLAuthMiddleware',
]

方法4:限制GraphiQL界面的访问

如果希望仅允许登录用户查看GraphiQL调试界面,可动态控制graphiql参数:

from django.contrib.auth.decorators import login_required
from graphene_django.views import GraphQLView
from .schema import schema

def graphql_view(request):
    # 仅登录用户能看到GraphiQL界面
    view = GraphQLView.as_view(graphiql=request.user.is_authenticated, schema=schema)
    return view(request)

urlpatterns = [
    path("graphql/", login_required(graphql_view)),
]

注意事项

  • 确保已运行python manage.py migrate,创建django-graphql-auth所需的数据库表
  • 客户端请求需携带JWT Token(通过django-graphql-auth的tokenAuth突变获取),放在请求头Authorization: JWT <your-token>中

内容的提问来源于stack exchange,提问作者Kalpesh Tawde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:35:01