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

如何在Django REST API中使用JWT实现身份认证与授权?

在Django REST API中实现JWT身份认证(基于djangorestframework-simplejwt)

注意djangorestframework-jwt已停止维护,官方现在推荐使用djangorestframework-simplejwt,这很可能是你之前配置失败的核心原因之一,以下是完整的分步实现方案:

1. 安装依赖包

pip install djangorestframework-simplejwt

(无需额外安装PyJWT,simplejwt已包含相关依赖)

2. 配置settings.py

在INSTALLED_APPS中添加rest_framework:

INSTALLED_APPS = [
    # 你的其他项目应用
    'rest_framework',
]

配置REST_FRAMEWORK的默认认证类:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

可选:添加JWT自定义配置(如token有效期),放在settings.py末尾:

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),  # 访问令牌有效期
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),     # 刷新令牌有效期
    'ROTATE_REFRESH_TOKENS': True,                   # 刷新时自动生成新的刷新令牌
}

3. 配置urls.py

在项目根urls.py中添加token相关路由:

from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    # 你的其他路由
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

4. 创建受保护的API视图

示例一个需要认证才能访问的视图:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class ProtectedView(APIView):
    permission_classes = [IsAuthenticated]  # 只有认证用户能访问

    def get(self, request):
        return Response({
            'msg': '这是受保护的内容',
            'current_user': request.user.username
        })

在urls.py中添加该视图的路由:

path('api/protected/', ProtectedView.as_view(), name='protected'),

5. 测试流程

  1. 获取Token:向/api/token/发送POST请求,携带用户账号密码(支持JSON或表单格式):

    {
        "username": "你的用户名",
        "password": "你的密码"
    }
    

    成功后会返回access(访问令牌)和refresh(刷新令牌)两个字段。

  2. 访问受保护接口:在请求头中添加Authorization: Bearer <你的access_token>,然后请求/api/protected/,即可获取带用户信息的响应。

  3. 刷新Token:当access_token过期后,向/api/token/refresh/发送POST请求,携带refresh_token:

    {
        "refresh": "你的refresh_token"
    }
    

    会返回新的access_token,无需重新登录。

常见问题排查

  • 确保使用的是Django默认User模型,若用自定义用户模型需确认配置正确
  • 检查请求头格式:Authorization字段必须是Bearer + 空格 + token的格式
  • 查看终端错误日志,定位具体报错(比如用户不存在、密码错误、配置覆盖等)
  • 确认settings.py中的REST_FRAMEWORK配置未被其他代码覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:25:11