如何为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
相关产品推荐
相关产品推荐

