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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:22