DRF中如何使用djangorestframework-simplejwt验证JWT令牌
djangorestframework-simplejwt 令牌验证实现指南
simplejwt 内置了完整的JWT校验逻辑,覆盖签名校验、过期校验、篡改识别等所有安全场景,不需要自行实现底层验签逻辑,根据你的业务场景选对应实现方式即可:
一、接口场景自动验证(90%场景适用)
完成基础配置后,框架会自动拦截请求完成令牌校验,校验不通过直接返回401状态码,不需要手动调用验证方法。
- 首先在项目配置中注册认证类:
# settings.py REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ( "rest_framework_simplejwt.authentication.JWTAuthentication", ) }
- 在需要登录才能访问的视图中添加权限类即可:
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
相关产品推荐
相关产品推荐

