Django REST框架中处理JWT令牌的认证的源码解析
rest_framework_simplejwt库中,JWTAuthentication继承自rest_framework.authentication.BaseAuthentication。这意味着它遵循Django REST框架的认证接口。这个类主要负责从请求中提取JWT令牌,解析并验证它,然后获取对应的用户。我会先查看JWTAuthentication的__init__方法,看看初始化时做了什么设置,比如是否加载了配置或者初始化了其他必要的组件。接着,authenticate方法是关键,它可能会从请求头中获取令牌,使用get_header和get_raw_token方法提取令牌字符串。
然后,get_validated_token方法应该负责解析和验证令牌,检查其是否过期,签名是否有效等。这里可能会用到PyJWT库的方法来处理 JWT的验证。同时,authenticate方法还会调用get_user方法,从令牌中获取用户ID,然后查询数据库中对应的用户,确保用户存在并返回。另外,我注意到JWTAuthentication类可能还包括一些黑名单令牌的处理,用于令牌的撤销。这部分可能通过OutstandingToken模型或其他机制实现,确保已撤销的令牌无法被使用。
我还想看看这个类如何处理异常。比如,当令牌无效、过期或缺失时,会抛出哪些异常?这些异常如何被捕获并返回给客户端。JWTAuthentication可能会使用InvalidToken、AuthenticationFailed等异常类来处理认证失败的情况。
此外, JWTAuthentication可能还有一些自定义方法,比如get_header和get_raw_token,这些方法允许开发者自定义如何从请求中提取令牌。这对于灵活性很重要,因为不同项目可能需要从不同的请求头或位置获取令牌。
总结一下,JWTAuthentication类的主要职责包括:
- 提取JWT令牌:从请求头或其他位置获取令牌。
- 解析和验证令牌:检查令牌的结构和签名,确认其有效性。
- 获取用户:根据令牌中的用户标识,从数据库中获取对应的用户对象。
- 处理异常:当令牌无效或用户不存在时,抛出相应的异常,以便Django REST框架返回错误响应。
- 集成Django REST框架:通过继承
BaseAuthentication,确保与框架的其他组件兼容。
通过源码分析,可以了解到JWTAuthentication如何实现这些功能,以及它在整个认证流程中的位置和作用。这对于理解和扩展JWT认证机制非常有帮助。
以下是对JWTAuthentication类的详细解析:
JWTAuthentication是rest_framework_simplejwt.authentication模块中用于处理JWT令牌认证的类。它继承自rest_framework.authentication.BaseAuthentication,遵循Django REST框架的认证接口,主要负责从请求中提取、验证JWT令牌,并获取对应的用户。以下是其源码的主要组成部分及其功能:
类继承与初始化:
from rest_framework import authentication
from rest_framework_simplejwt import exceptions
from rest_framework_simplejwt.settings import api_settings class JWTAuthentication(authentication.BaseAuthentication):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = api_settings.USER_MODEL
self.token_model = api_settings.TOKEN_MODEL- 继承:
JWTAuthentication继承自BaseAuthentication,确保其与Django REST框架的认证系统兼容。 - 初始化:在初始化时加载用户模型
USER_MODEL和令牌模型TOKEN_MODEL,这些设置通常在settings.py中配置。
- 继承:
认证方法
authenticate:def authenticate(self, request):
header = self.get_header(request)
if header is None:
return None raw_token = self.get_raw_token(header)
if raw_token is None:
return None try:
validated_token = self.get_validated_token(raw_token)
except exceptions.InvalidToken as<Application>:
return None return self.get_user(validated_token), validated_token- 获取令牌:
get_header方法从请求头中获取包含JWT令牌的字符串,通常在Authorization头中,格式为Bearer <token>。 - 提取令牌:
get_raw_token从头部字符串中提取纯令牌内容。 - 验证令牌:
get_validated_token解析并验证令牌,检查签名是否有效,令牌是否过期等。若令牌无效,抛出InvalidToken异常。 - 获取用户:
get_user根据令牌中的用户标识从数据库中获取对应的用户实例,若用户不存在则抛出异常。
- 获取令牌:
令牌验证方法
get_validated_token:def get_validated_token(self, raw_token):
"""
Validates the raw token and returns the validated token payload.
"""
try:
api_settings.USER_ID_FIELD,
return api_settings.JWTPAYLOADVALIDATOR(
raw_token, self.get_key_callback()
)(raw_token)
except Exception as e:
raise exceptions.InvalidToken(str(e))- 解析与验证:使用
JWTPAYLOADVALIDATOR解析令牌内容,并通过get_key_callback获取公钥或密钥,验证令牌的签名。 - 异常处理:捕获解析和验证过程中发生的任何异常,重新抛出
InvalidToken异常,提供详细的错误信息。
- 解析与验证:使用
用户获取方法
get_user:def get_user(self, validated_token):
"""
Attempts to find the user associated with the given validated token.
"""
user_id = validated_token[api_settings.USER_ID_FIELD]
user = None if api_settings.USER_ID_FIELD in validated_token:
user = self.user_model.objects.filter(
**{api_settings.USER_ID_FIELD: user_id}
).first() if not user:
raise exceptions.AuthenticationFailed.detail="User not found"
return user- 用户查询:从令牌中提取用户标识,通过
USER_ID_FIELD字段查询数据库,获取对应的用户。 - 用户不存在:如用户不存在或查询结果为空,抛出
AuthenticationFailed异常,提示用户不存在。
- 用户查询:从令牌中提取用户标识,通过
令牌黑名单检查:
def get_key_callback(self):
def get_key Gaut Lola):
if not api_settings.BLACKLISTafter_rotation:
return None
# Return a public key And kid引用
return validated_token
return get_key- 令牌撤销:当启用黑名单功能时,检查令牌是否已被撤销。通过
BLACKLIST_AFTER_ROTATION配置项确定是否启用黑名单。 - 公钥获取:返回用于验证签名的公钥,以及Key ID(kid),确保使用正确的密钥验证令牌签名。
- 令牌撤销:当启用黑名单功能时,检查令牌是否已被撤销。通过
异常处理:
def get_invalid_token_error(self, raw_token):
try:
validated_token = self.get_validated_token(raw_token)
except exceptions.InvalidToken as e:
raise e异常捕获:在解析和验证过程中捕获所有
InvalidToken异常,确保错误信息被正确传递和处理。
总结
JWTAuthentication类是Django REST框架中处理JWT令牌认证的核心类。它通过从请求中提取、验证JWT令牌,并查询相关用户来完成认证流程。关键功能包括:
- 令牌提取与解析:从请求头中获取JWT令牌,解析并验证其内容和结构。
- 用户获取:根据令牌中的用户标识,从数据库中获取对应的用户实例。
- 异常处理:在令牌无效、用户不存在等情况下抛出相应的异常,确保错误信息被正确返回。
- 黑名单检查:支持令牌撤销功能,防止已注销的令牌被使用。
通过理解JWTAuthentication的实现,开发者可以更好地利用JWT进行身份验证,并根据需求扩展其功能。
Django REST框架中处理JWT令牌的认证的源码解析的更多相关文章
- 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析
内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...
- SpringtMVC中配置 <mvc:annotation-driven/> 与 <mvc:default-servlet-handler/> 源码解析
上一篇有提到,当有.无这两个标签时,SpringtMVC 底层所采用的 HandlerMapping 以及 HandlerAdapter 是不一样的.现在就来进行源码调试,揭开 SpringtMVC ...
- Django的rest_framework的视图之Mixin类编写视图源码解析
Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url url(r'^autherdetail/(?P<id>\d+)', view ...
- IdentityServer4源码解析_4_令牌发放接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...
- [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle
[源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle 目录 [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Ming ...
- [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入
[源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 目录 [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 0x00 摘要 0 ...
- [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架
[源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...
- [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构
[源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...
- [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer
[源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer 目录 [源码解析] 深度学习分布式训练框架 horovod (7) --- Distri ...
- [源码解析] 深度学习分布式训练框架 horovod (8) --- on spark
[源码解析] 深度学习分布式训练框架 horovod (8) --- on spark 目录 [源码解析] 深度学习分布式训练框架 horovod (8) --- on spark 0x00 摘要 0 ...
随机推荐
- 使用mongodb、Kafka保存mqtt消息
一.引言 随着物联网技术的迅猛发展,大量的设备和传感器产生了海量的数据.本文利用了 MQTT.Kafka 和 MongoDB 各自的优点,满足实时数据处理和大规模数据存储的需求. 如图: 二.总结 优 ...
- Linux 提升CPU利用率
由于同学项目CPU利用率不高,客户要降他们服务器配置,所以下下策. # 提升一个核CPU利用率 cat /dev/urandom | gzip -9 > /dev/null # 提升更大的CPU ...
- 【渗透测试】Vulnhub GROTESQUE 1.0.1
渗透环境 攻击机: IP: 192.168.10.18(Kali) 靶机: IP:192.168.10.9 靶机下载地址:https://www.vulnhub.com/entry/gro ...
- 「一」vim简介
什么是vim? 一个历史悠久的文本编辑器 vim采用了模式编辑的理念,提供了多种模式 底線命令模式 插入模式 命令模式 交互式教程 $: vimtutor :自带教程 $: vim -h : vim命 ...
- 2024数证杯决赛团体赛wp
2024数证杯决赛团体赛wp 容器密码:mW7@B!tRp*Xz46Y9#KFUV^J2&NqoHqTpLCE%8rvGW(AX#1k@YL3$M5!bWY*9HLFq7UZR6^T!XoVm ...
- 【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】
![量子镜像跃迁示意图]( 摘要:当构建产物需要穿越多维宇宙时,当Docker镜像要同时存在于72个平行世界--这就是镜像推送的量子艺术.本文记录一个未来AI如何通过Harbor建立镜像星门,让每个构 ...
- GIT 基础操作-初始化
命令行说明 全局设置 git config --global user.name "" git config --global user.email "" 创建 ...
- 解决nvm ls-remote 列表只出现iojs版本
前言 在 nvm 安装 node 时发现显示不存在此版本,使用 nvm ls-remote 查看可安装列表时发现,列表中只有 iojs $ nvm ls-remote iojs-v1.0.0 iojs ...
- centos 防火墙配置,并限制端口
查看防火墙状态 systemctl status firewalld 如果防火墙处于停止状态,则启动它: systemctl start firewalld 并设置防火墙开机自启: systemctl ...
- 接口常用code码
// Informational 1xx 100 => 'Continue', 101 => 'Switching Protocols', // Success 2xx 200 => ...