如何通过JWT Token实现用户认证以解决权限错误问题
解决方案:通过JWT Token完成认证以解决Todos权限错误
1. 修正前端请求头的格式与拼写
前端使用Apollo Client发送请求时,必须保证请求头的键名是Authorization(美式拼写,首字母大写),且格式匹配后端配置的JWT前缀。正确的请求头格式应为:
Authorization: JWT <你的Token值>
如果是通过createHttpLink配置请求头,代码示例如下:
import { createHttpLink } from '@apollo/client'; const httpLink = createHttpLink({ uri: '/graphql', headers: { Authorization: `JWT ${localStorage.getItem('token')}` } });
注意:若键名写成
authorisation(英式拼写),后端的JWT_AUTH_HEADER_PREFIX配置将无法识别请求头中的Token。
2. 补全后端Django GraphQL的JWT认证配置
仅设置GRAPHQL_JWT前缀不足以完成认证,需在backend/todo/settings.py中补全以下配置:
2.1 启用必要的应用与中间件
确保INSTALLED_APPS包含依赖应用:
INSTALLED_APPS = [ # ... 其他已有应用 'graphql_jwt', 'graphene_django', 'todoapp', ]
添加认证中间件到MIDDLEWARE:
MIDDLEWARE = [ # ... 其他已有中间件 'django.contrib.auth.middleware.AuthenticationMiddleware', ]
2.2 配置认证后端
添加JWT认证后端到AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = [ 'graphql_jwt.backends.JSONWebTokenBackend', 'django.contrib.auth.backends.ModelBackend', ]
2.3 为GraphQL查询添加认证装饰器
在backend/todoapp/scheme.py中,给todos查询添加login_required装饰器,确保只有认证用户可访问:
import graphene from graphene_django import DjangoObjectType from graphql_jwt.decorators import login_required from .models import Todo class TodoType(DjangoObjectType): class Meta: model = Todo class Query(graphene.ObjectType): todos = graphene.List(TodoType) @login_required def resolve_todos(self, info, **kwargs): return Todo.objects.all() schema = graphene.Schema(query=Query)
若使用类基视图配置GraphQL接口,需绑定JWT认证:
# backend/todo/urls.py from django.urls import path from graphene_django.views import GraphQLView from graphql_jwt.decorators import jwt_cookie urlpatterns = [ path('graphql', jwt_cookie(GraphQLView.as_view(graphiql=True))), ]
3. 验证Token的有效性
确保使用的JWT Token是通过后端合法接口生成的,比如通过tokenAuth mutation获取:
mutation TokenAuth($username: String!, $password: String!) { tokenAuth(username: $username, password: $password) { token } }
避免使用过期或伪造的Token,这会直接导致权限验证失败。
4. 检查自定义权限类(若有)
如果你的Todo模型或查询使用了自定义权限类,需确保权限类能正确识别JWT认证的用户,避免与login_required装饰器产生冲突。
内容的提问来源于stack exchange,提问作者ilya
相关产品推荐
相关产品推荐

