django-graphql-jwt使用@login_required报GraphQLLocatedError 测试正常
问题核心原因
你遇到的权限报错完全来自配置项的拼写错误。
在settings.py的GRAPHENE配置块中,中间件配置的键名拼写少了一个字母e,写为MIDDLWARE,正确的键名应为MIDDLEWARE。Graphene加载配置时只会识别标准拼写的MIDDLEWARE键,你写错的键名会被直接忽略,导致graphql_jwt.middleware.JSONWebTokenMiddleware根本没有被加载执行。
对应现象的逻辑解释
- 内置JWT接口(
getTokenAuth、VerifyToken、RefreshToken)可以正常工作,是因为这些接口的实现自带独立的Token解析逻辑,不依赖Graphene全局中间件的执行,不受配置拼写错误的影响。 - 单元测试可以正常通过,是因为
JSONWebTokenTestCase是在测试客户端层面直接完成用户认证注入的,不经过Graphene层的中间件流程,即便中间件没有加载,测试流程也能正常拿到已认证用户的信息。 - 实际Postman请求时报权限不足,是因为中间件未加载的情况下,系统无法从你请求头携带的
Authorization: Bearer <token>内容中解析出对应用户,也不会把用户信息绑定到info.context上。@login_required装饰器检查时发现上下文里的用户是未认证的匿名对象,就抛出了权限不足的错误。
修复方法
修正settings.py中GRAPHENE配置的拼写错误即可,修正后的完整配置如下:
GRAPHENE = { "SCHEMA": "myproject.graphql.api.schema", "MIDDLEWARE": [ "graphql_jwt.middleware.JSONWebTokenMiddleware", ], }
修正后重启Django服务,再次携带有效Token发请求即可正常访问加了@login_required装饰器的查询。可以在resolve_hello方法中打印info.context.user做验证,修正前输出为匿名用户,修正后会输出Token对应的已登录用户对象。
内容的提问来源于stack exchange,提问作者Jocho Delgado
相关产品推荐
相关产品推荐

