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

DRF中如何使用djangorestframework-simplejwt验证JWT令牌

djangorestframework-simplejwt 令牌验证实现指南

simplejwt 内置了完整的JWT校验逻辑,覆盖签名校验、过期校验、篡改识别等所有安全场景,不需要自行实现底层验签逻辑,根据你的业务场景选对应实现方式即可:

一、接口场景自动验证(90%场景适用)

完成基础配置后,框架会自动拦截请求完成令牌校验,校验不通过直接返回401状态码,不需要手动调用验证方法。

  1. 首先在项目配置中注册认证类:
# settings.py
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    )
}
  1. 在需要登录才能访问的视图中添加权限类即可:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class UserProtectedView(APIView):
    # 加这一行就会自动校验请求头中携带的Access Token
    permission_classes = [IsAuthenticated]

    def get(self, request):
        # 代码执行到此处时令牌已经校验通过,request.user对应当前登录用户实例
        return Response({
            "msg": "访问受保护资源成功",
            "username": request.user.username
        })

二、自定义场景手动验证

如果你需要在非视图逻辑(比如中间件、定时任务、自定义脚本)中单独校验某个令牌字符串,可以直接调用simplejwt内置的令牌类完成校验,校验失败会抛出对应异常,捕获处理即可:

from rest_framework_simplejwt.tokens import AccessToken, RefreshToken
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError, ExpiredTokenError

def manual_verify_token(token_str: str, token_type: str = "access"):
    """
    手动校验JWT令牌
    :param token_str: 待校验的令牌字符串
    :param token_type: 令牌类型,可选值 access/refresh
    """
    try:
        if token_type == "refresh":
            valid_token = RefreshToken(token_str)
        else:
            valid_token = AccessToken(token_str)
        
        # 校验通过后可直接读取令牌内存储的载荷数据
        return {
            "is_valid": True,
            "user_id": valid_token.get("user_id"),
            "payload": valid_token.payload
        }
    except ExpiredTokenError:
        return {"is_valid": False, "err_msg": "令牌已过期"}
    except InvalidToken:
        return {"is_valid": False, "err_msg": "令牌签名错误、格式非法或已被篡改"}
    except TokenError as e:
        return {"is_valid": False, "err_msg": f"令牌校验失败:{str(e)}"}

手动验证流程会自动完成以下安全检查,不需要额外编码:

  • 签名合法性校验(防止令牌被篡改)
  • 过期时间校验(核对exp字段是否超出有效期)
  • 生效时间校验(如果配置了nbf字段,会校验令牌是否已到生效时间)
  • 黑名单校验(如果开启了令牌黑名单功能,会自动校验jti是否在作废列表中)

三、对外提供令牌校验接口

如果需要给前端提供独立的令牌校验接口,直接使用simplejwt内置的视图即可,不需要自行编写逻辑:

# 项目根路由 urls.py
from django.urls import path
from rest_framework_simplejwt.views import TokenVerifyView

urlpatterns = [
    # 其余已有路由...
    path('api/auth/token/verify/', TokenVerifyView.as_view(), name='token-verify'),
]

该接口接收POST请求,请求体传{"token": "待校验的令牌字符串"}即可,校验通过返回200状态码,校验失败返回401状态码及对应错误信息。

注意:不要自行手写JWT签名、验签逻辑,simplejwt的内置实现已经覆盖了所有通用安全校验规则,自行实现很容易遗漏校验项造成安全漏洞。如果需要增加自定义校验规则(比如额外校验令牌内的自定义字段、核对用户账号状态是否正常),可以继承JWTAuthentication类重写get_validated_token方法,在原有校验逻辑后追加你的自定义判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:09:15