想了解`JWTAuthentication`这个类的源码解析。`JWTAuthentication`是来自`rest_framework_simplejwt.authentication`模块的,它用于在Django REST框架中处理JWT令牌的认证。首先,我需要找到这个类的源码,看看它是如何实现的。我记得在rest_framework_simplejwt库中,JWTAuthentication继承自rest_framework.authentication.BaseAuthentication。这意味着它遵循Django REST框架的认证接口。这个类主要负责从请求中提取JWT令牌,解析并验证它,然后获取对应的用户。

我会先查看JWTAuthentication__init__方法,看看初始化时做了什么设置,比如是否加载了配置或者初始化了其他必要的组件。接着,authenticate方法是关键,它可能会从请求头中获取令牌,使用get_headerget_raw_token方法提取令牌字符串。

然后,get_validated_token方法应该负责解析和验证令牌,检查其是否过期,签名是否有效等。这里可能会用到PyJWT库的方法来处理 JWT的验证。同时,authenticate方法还会调用get_user方法,从令牌中获取用户ID,然后查询数据库中对应的用户,确保用户存在并返回。另外,我注意到JWTAuthentication类可能还包括一些黑名单令牌的处理,用于令牌的撤销。这部分可能通过OutstandingToken模型或其他机制实现,确保已撤销的令牌无法被使用。

我还想看看这个类如何处理异常。比如,当令牌无效、过期或缺失时,会抛出哪些异常?这些异常如何被捕获并返回给客户端。JWTAuthentication可能会使用InvalidTokenAuthenticationFailed等异常类来处理认证失败的情况。

此外, JWTAuthentication可能还有一些自定义方法,比如get_headerget_raw_token,这些方法允许开发者自定义如何从请求中提取令牌。这对于灵活性很重要,因为不同项目可能需要从不同的请求头或位置获取令牌。

总结一下,JWTAuthentication类的主要职责包括:

  1. 提取JWT令牌:从请求头或其他位置获取令牌。
  2. 解析和验证令牌:检查令牌的结构和签名,确认其有效性。
  3. 获取用户:根据令牌中的用户标识,从数据库中获取对应的用户对象。
  4. 处理异常:当令牌无效或用户不存在时,抛出相应的异常,以便Django REST框架返回错误响应。
  5. 集成Django REST框架:通过继承BaseAuthentication,确保与框架的其他组件兼容。

通过源码分析,可以了解到JWTAuthentication如何实现这些功能,以及它在整个认证流程中的位置和作用。这对于理解和扩展JWT认证机制非常有帮助。

以下是对JWTAuthentication类的详细解析:

JWTAuthenticationrest_framework_simplejwt.authentication模块中用于处理JWT令牌认证的类。它继承自rest_framework.authentication.BaseAuthentication,遵循Django REST框架的认证接口,主要负责从请求中提取、验证JWT令牌,并获取对应的用户。以下是其源码的主要组成部分及其功能:

  1. 类继承与初始化:

    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中配置。
  2. 认证方法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根据令牌中的用户标识从数据库中获取对应的用户实例,若用户不存在则抛出异常。
  3. 令牌验证方法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异常,提供详细的错误信息。
  4. 用户获取方法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异常,提示用户不存在。
  5. 令牌黑名单检查:

    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),确保使用正确的密钥验证令牌签名。
  6. 异常处理:

    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令牌,并查询相关用户来完成认证流程。关键功能包括:

  1. 令牌提取与解析:从请求头中获取JWT令牌,解析并验证其内容和结构。
  2. 用户获取:根据令牌中的用户标识,从数据库中获取对应的用户实例。
  3. 异常处理:在令牌无效、用户不存在等情况下抛出相应的异常,确保错误信息被正确返回。
  4. 黑名单检查:支持令牌撤销功能,防止已注销的令牌被使用。

通过理解JWTAuthentication的实现,开发者可以更好地利用JWT进行身份验证,并根据需求扩展其功能。

Django REST框架中处理JWT令牌的认证的源码解析的更多相关文章

  1. 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析

    内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...

  2. SpringtMVC中配置 <mvc:annotation-driven/> 与 <mvc:default-servlet-handler/> 源码解析

    上一篇有提到,当有.无这两个标签时,SpringtMVC 底层所采用的  HandlerMapping 以及 HandlerAdapter 是不一样的.现在就来进行源码调试,揭开 SpringtMVC ...

  3. Django的rest_framework的视图之Mixin类编写视图源码解析

    Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url url(r'^autherdetail/(?P<id>\d+)', view ...

  4. IdentityServer4源码解析_4_令牌发放接口

    目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...

  5. [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle

    [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle 目录 [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Ming ...

  6. [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入

    [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 目录 [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 0x00 摘要 0 ...

  7. [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架

    [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...

  8. [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构

    [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...

  9. [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer

    [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer 目录 [源码解析] 深度学习分布式训练框架 horovod (7) --- Distri ...

  10. [源码解析] 深度学习分布式训练框架 horovod (8) --- on spark

    [源码解析] 深度学习分布式训练框架 horovod (8) --- on spark 目录 [源码解析] 深度学习分布式训练框架 horovod (8) --- on spark 0x00 摘要 0 ...

随机推荐

  1. [BZOJ4833] 最小公倍佩尔数 题解

    在这篇题解中,我会将各个部分的证明分成不同的推导过程,以达到逐一击破的效果. 引理 1:\(f(n)=2f(n-1)+f(n-2)\) 我的证明挺繁琐的,过程如下: \[(1+\sqrt 2)^{n- ...

  2. 使用Visual Studio 调式NDK so 库时,调试工具无法显示vector内容

    最近在研究C++开发安卓端so库,demo使用xamarin.android作为载体来验证算法库文件的准确性.调试过程中发现vector中的内容无法显示集合详细.如下图 研究了半天(参考链接2.3), ...

  3. MybatisPlus - [04] 分页

    limit m,n.PageHelper.MyBatisPlus分页插件 001 || MybatisPlus分页插件 (1)引入maven依赖 <dependency> <grou ...

  4. go、thinkphp8、webman数据读取并发测试、性能测试

    前期准备:本地搭建程序运行所需环境,分别编写go,thinkphp8和webman程序,确保程序运行正常,新建mysql的student表,模拟存储学生信息,共计3646条数据,分别使用go语言.th ...

  5. 【MATLAB习题】牛头刨床机构的运动学分析

    1. 数学模型 已知牛头刨床主运动机构各构件的尺寸为: \(l1=125mm,l3=600mm,l4=150mm,l6=275mm,l'6=575mm\),原动件1以匀角速度ω1=1rad/s逆时针转 ...

  6. excel怎么根据数值做进度条

    开始->条件格式->数据条

  7. ChromeOS 134 版本更新

    ChromeOS 134 版本更新 一.ChromeOS 134 更新内容 1. ChromeOS 自助终端(Kiosk)模式支持隔离 Web 应用(Isolated Web Apps) 从 Chro ...

  8. 质数测试——Fermat素数测试和MillerRabin素数测试

    质数测试 今天我来填坑了,之前我在数学基础算法--质数篇这篇文章中提到我要单独讲一下MillerRabin算法,最近已经有许多粉丝在催了,所以我马不停蹄的来出这篇文章了,顺便把Fermat素数测试也讲 ...

  9. React.memo 解决函数组件重复渲染

    为什么会存在重复渲染? react 在 v16.8 版本引入了全新的 api,叫做 React Hooks,它的使用与以往基于 class component 的组件用法非常的不一样,不再是基于类,而 ...

  10. PIL或Pillow学习1

    PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以来,由于 PIL 库更新缓慢,目前仅支 ...